特定の行列のすべてのエントリが同じ単位を共有しているわけではない行列計算には、多くの便利なアプリケーションがあるようです。これらの単位を追跡できる型システムを調べて、間違いを犯さないようにしたいと思います (スカラー演算の次元チェックを既に行っている多くのライブラリや言語と同様)。私が話していることの例を挙げてから、そこから構築するいくつかの質問があります.
(ここからランダムな混合単位の線形計画法の例を引用しますが、これは宿題の質問ではなく、うまくいけば明らかになります)
ボブのベーカリーではベーグルとマフィンを販売しています。ボブがベーグルを 12 個焼くには、小麦粉 5 カップ、卵 2 個、砂糖 1 カップが必要です。ボブがマフィンを 12 個焼くには、小麦粉 4 カップ、卵 4 個、砂糖 2 カップが必要です。ボブはベーグルを 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 x 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)
2x2行列で行ったいくつかの手計算は、 の単位が の単位の要素ごとの逆数であることを示唆していますTranspose(M)
が、一般的なケースでそれを表示する方法がわかりません。 - これらの問題に関する学術研究を知っていますか? それとも、何らかの言語のプログラムに対してこの静的分析を実行するソフトウェアですか? 間違った検索用語を使用している可能性がありますが、何も見つかりません。
私の関心のある実世界のアプリケーションは、すべてのフィルター ゲインなどに正しい単位がどこにでもあることを確認することで、信号処理/コントローラー ソフトウェアの失敗を防ぎます。これらのアプリケーションでは、異なるセルの異なる単位でこのような行列を使用することは非常に一般的です。