似乎矩阵数学有许多有用的应用,其中并非给定矩阵中的所有条目共享相同的单元。我想研究可以跟踪这些单元并确保我们不会出错的类型系统(类似于已经对标量算法进行维度检查的许多库和语言)。我将举例说明我所谈论的内容,然后我从那里开始构建一些问题。
(来自here的随机混合单元线性编程示例,虽然这不是一个功课问题,但希望会变得清晰)
鲍勃的面包店出售百吉饼和松饼。为了烤十几个百吉饼,鲍勃需要5杯面粉,2 鸡蛋和一杯糖。要烤十几个松饼,鲍勃需要4杯面粉,4个 鸡蛋和两杯糖。鲍勃可以卖10美元/打的百吉饼和松饼 $ 12 /打。鲍勃有50杯面粉,30个鸡蛋和20杯糖。为了最大限度地增加收入,鲍勃应该烤多少个百吉饼和松饼?
所以让我们以矩阵形式(任意具体语法......):
A = [ [ 5 cups of flour / dozen bagels, 4 cups of flour / dozen muffins ],
[ 2 eggs / dozen bagels, 4 eggs / dozen muffins ],
[ 1 cups of sugar / dozen bagels, 2 cups of sugar / dozen muffins ] ]
B = [ [ 10 dollars / dozen bagels, 12 dollars / dozen muffins ] ]
C = [ [ 50 cups of flour ],
[ 30 eggs ],
[ 20 cups of sugar ] ]
我们现在希望最大化内部产品B * X
,使A * X <= C
和X >= 0
成为普通的线性规划问题。
在一个带单元检查的假设语言中,我们如何理想地表示这些矩阵的类型?
我认为m×n矩阵只需要m + n个单位而不是完整的m * n个单位,因为除非单位以合理的方式分布到行和列中,否则唯一合理的操作就是用另一个完全相同的形状加上/减去完全一般的矩阵,或者用标量乘以它。
我的意思是A
中的单位排列比以下单位更有用:
WTF = [ [ 6 pigeons, 11 cups of sugar ],
[ 1 cup of sugar, 27 meters ],
[ 2 ohms, 2 meters ] ]
此外,像后者这样的情况根本不会在实践中出现。 (任何人都有反例?)
在这个简化的假设下,我们可以用m + n个单位表示矩阵的单位,如下所示。对于m行中的每一行,我们计算出该行中所有条目共有的单位,对于n列也是如此。让我们将行单位放在列向量中,将列单位放在行向量中,因为这会使Units(M) = RowUnits(M) * ColUnits(M)
成为一个不错的属性。因此,在示例中:
RowUnits(A) = [ [ cups of flour ],
[ eggs ],
[ cups of sugar ] ]
ColUnits(A) = [ [ dozen bagels ^ -1, dozen muffins ^ -1 ] ]
RowUnits(B) = [ [ dollars ] ]
ColUnits(B) = [ [ dozen bagels ^ -1, dozen muffins ^ -1 ] ]
RowUnits(C) = [ [ cups of flour ],
[ eggs ],
[ cups of sugar ] ]
ColUnits(C) = [ [ 1 ] ]
似乎(虽然我不确定如何证明它......)M1 * M2
的单位是RowUnits(M1 * M2) = RowUnits(M1)
,ColUnits(M1 * M2) = ColUnits(M2)
,并且乘法有意义我们需要ColUnits(M1) * RowUnits(M2) = 1
。
我们现在可以推断X
的单位,因为表达式A * X <= C
必须表示A * X
和C
具有相同的单位。这意味着RowUnits(A) = RowUnits(C)
(检出),ColUnits(X) = ColUnits(C)
和RowUnits(X)
是ColUnits(A)
转置的元素相互对应,换句话说RowUnits(X) = [ [ dozen bagels ], [ dozen muffins ] ]
(“万岁”,我听到你欢呼,“我们刚刚绕过月球去看一些完全明显的东西!”)
我的问题是这些:
furlongs ^ 17
,以便您可以将每列乘以furlongs ^ -17
?Inverse(M)
的单位是Transpose(M)
单位的元素相互对数,但我不知道如何在一般情况下显示它或即使一般情况确实如此。我感兴趣的真实应用是通过确保所有滤波器增益等在任何地方都具有正确的单位来防止信号处理/控制器软件的搞乱,使用不同单元中具有不同单元的矩阵在这些中非常常见应用
答案 0 :(得分:1)
4)如果你承认inv(M)* M = Identity是无量纲的(Id * X = X),这与3)相同的证据
5)我会询问是否可以扩展BOOST UNITS http://www.boost.org/doc/libs/1_50_0/doc/html/boost_units.html并最终联系作者
1&amp; 3)
您的尺寸问题Adim * Xdim = Ydim可以转换为无量纲问题A * X = Y
那是
Ydim=diag(units(Y))*Y
Ydim=diag(units(Y))*A*X
Ydim=diag(units(Y))*A*inv(diag(units(X)))*Xdim
Ydim=Adim*Xdim
或者反过来
Adim*Xdim=Ydim
Adim*diag(units(X))*X=diag(units(Y))*Y
Adim*diag(units(X))*X=diag(units(Y))*A*X
对于任何X都是如此,所以你找到了
A=inv(diag(units(Y))) * Adim * diag(units(X))
Adim=diag(units(Y)) * A * inv(diag(units(X)))
也就是说,将无量纲A的行与Y和列的单位乘以X的单位倒数
2)从数学角度来说,你通常会将一个标量数量从矩阵中分解出来,所以我认为这个问题与5)更相关,你如何用软代表它。在回答5)
时,您必须将此功能作为一项要求答案 1 :(得分:0)
我认为好的现实世界的例子 - 对你的问题1的回答 - 可能是Discrete Kalman Filter实施。通常,其方程对元组和矩阵进行操作,其中一些可能代表对应于物理单位的值。
只要需要多维卡尔曼滤波器计算,估计结果在值类型中不均匀,我认为会有反转和转置,以及具有一定(对称)的矩阵之间的乘法代表不同物理事物的价值的混合物。
我尝试在代码中使用带有C ++和strongly typed value representation的DKF实现传感器融合算法时,我刚刚触及了这个问题。
有很多卡尔曼滤波器实现,开发人员只使用整数,浮点数,双精度等矢量和矩阵,但我想跟踪每个使用的值的维度,然后出现问题。
不幸的是,我对这个问题很新鲜(仍在努力),所以我现在还不能用2到5的答案帮助你: - /