单位如何流经矩阵运算?

时间:2012-08-15 19:12:48

标签: linear-algebra units-of-measurement type-systems

似乎矩阵数学有许多有用的应用,其中并非给定矩阵中的所有条目共享相同的单元。我想研究可以跟踪这些单元并确保我们不会出错的类型系统(类似于已经对标量算法进行维度检查的许多库和语言)。我将举例说明我所谈论的内容,然后我从那里开始构建一些问题。

(来自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 <= CX >= 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 * XC具有相同的单位。这意味着RowUnits(A) = RowUnits(C)(检出),ColUnits(X) = ColUnits(C)RowUnits(X)ColUnits(A)转置的元素相互对应,换句话说RowUnits(X) = [ [ dozen bagels ], [ dozen muffins ] ]

(“万岁”,我听到你欢呼,“我们刚刚绕过月球去看一些完全明显的东西!”)

我的问题是这些:

  1. 你能想到现实世界的例子,矩阵的元素有不属于“行单位”和“列单位”的单位吗?
  2. 你能想到一种优雅的方式来处理每个单元中相同单位是一个因素的情况,因此它可以等效地放在每个“行”或每个“列”中,因此行单元和列单位不是一个独特的代表?应该将条件设置为“最低术语”并消除愚蠢行为,例如将每行乘以furlongs ^ 17,以便您可以将每列乘以furlongs ^ -17
  3. 你能证明我提到的通过矩阵乘法传播这些单位注释的规则吗?
  4. 您能否发现/显示这些单位注释如何通过矩阵逆运算传播的规则?我使用2x2矩阵进行的一些手动计算表明Inverse(M)的单位是Transpose(M)单位的元素相互对数,但我不知道如何在一般情况下显示它或即使一般情况确实如此。
  5. 您是否了解有关这些问题的任何学术工作?或者是用某种语言对程序执行静态分析的软件?我可能使用了错误的搜索字词,但我找不到任何内容。
  6. 我感兴趣的真实应用是通过确保所有滤波器增益等在任何地方都具有正确的单位来防止信号处理/控制器软件的搞乱,使用不同单元中具有不同单元的矩阵在这些中非常常见应用

2 个答案:

答案 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

  • 您将输入参数X除以各自的单位(X)
  • 然后将您的输出Y乘以其各自的单位(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的答案帮助你: - /