GNU Octaveでは、行列除算はどのように機能しますか?
する代わりに
1./[1;1]
誤ってやった
1/[1;1]
驚いたことに、これは次のようになります。
[0.5, 0.5]
横方向の場合:
1/[1,1]
期待されるものを与える:
error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)
誰かが[0.5、0.5]の結果を説明できますか?
GNU Octaveでは、行列除算はどのように機能しますか?
する代わりに
1./[1;1]
誤ってやった
1/[1;1]
驚いたことに、これは次のようになります。
[0.5, 0.5]
横方向の場合:
1/[1,1]
期待されるものを与える:
error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)
誰かが[0.5、0.5]の結果を説明できますか?
次の例を考えてみましょう。
>> A = [5 10];
>> B = [2 2];
要素ごとの除算が必要な場合は、両方の要素の行列サイズが等しいA ./ Bを使用します。つまり、Aのサイズがm ∗ nの場合、Bのサイズはm ∗nである必要があります。
>> A ./B
ans =
2.5000 5.0000
行列分割による行列が必要な場合は、要素Aの行列サイズをm ∗ n、Bをq ∗nまたはm∗nとしてA/Bを使用します。/演算子は、x ∗ y-1(つまり、オクターブ形式のx * pinv(y))を返そうとしています。
>> A / B
ans = 3.7500
これはと同じです
>> A * pinv(B)
ans = 3.7500
OCTAVE / MATLABのpinv()関数は、行列のムーア-ペンローズ逆行列を返しますが、inv()関数は行列の逆行列を返します。何を使用するかについて混乱している場合は、pinv()を使用してください。pinvとinvの違いについてさらに詳しく知りたい場合は、
これは、コースラ機械学習コースのディスカッションフォーラムでAlanBoultonから得た回答です。
アイデアの要点は、x / yが非常に一般的に定義されているため、行列を処理できるということです。概念的には、次の例のように、/演算子はx ∗ y-1(またはオクターブスピークではx * inv(y))を返そうとしています。
octave:1> eye(2)/[1 2;3 4]
ans =
-2.00000 1.00000
1.50000 -0.50000
octave:2> inv([1 2;3 4])
ans =
-2.00000 1.00000
1.50000 -0.50000
トリッキーな点は、yが列ベクトルの場合に発生します。この場合、inv(y)は未定義であるため、yの疑似逆行列であるpinv(y)が使用されます。
octave:1> pinv([1;2])
ans =
0.20000 0.40000
octave:2> 1/[1;2]
ans =
0.20000 0.40000
x * pinv(y)が明確に定義されるように、ベクトルyはxと互換性がある必要があります。したがって、xに互換性がある限り、yが行ベクトルであれば問題ありません。説明については、次のOctaveセッションを参照してください。
octave:18> pinv([1 2])
ans =
0.20000
0.40000
octave:19> 1/[1 2]
error: operator /: nonconformant arguments (op1 is 1x1, op2 is 1x2)
octave:19> eye(2)/[1 2]
ans =
0.20000
0.40000
octave:20> eye(2)/[1;2]
error: operator /: nonconformant arguments (op1 is 2x2, op2 is 2x1)
octave:20> 1/[1;2]
ans =
0.20000 0.40000
ここからオクターブマトリックス部門の正式な説明
http://www.gnu.org/software/octave/doc/interpreter/Arithmetic-Ops.html
x / y
Right division. This is conceptually equivalent to the expression
(inverse (y') * x')'
But it is computed without forming the inverse of y'.
If the system is not square, or if the coefficient matrix is
singular, a minimum norm solution is computed.
つまり、これら2つは同じである必要があります。
[3 4]/[4 5; 6 7]
ans =
1.50000 -0.50000
(inverse([4 5; 6 7]') * [3 4]')'
ans =
1.50000 -0.50000
まず、行列の乗算が可換ではないのと同様に、オクターブ行列の除算は可換ではないことを理解してください。
つまり、A/BはB/Aと等しくありません
1/[1;1]
ans =
0.50000 0.50000
[1;1]/1
ans =
1
1
1つを単一の値を持つ行列で割ったものは1つです。
1/[1]
ans = 1
1を単一の値3の行列で割ると、0.33333になります。
1/[3]
ans = .33333
1つを(1x2)行列で割ったもの:
1/[1;1]
ans =
0.50000 0.50000
Equivalent:
([1/2;1/2] * 1)'
ans =
0.50000 0.50000
上記の説明のように、ベクトルのノルムを使用していることに注意してください。これで、がどのように変換されたかがわかり[1;1]
ます [1/2; 1/2]
。「2」はベクトルの長さに由来し、1は提供されたベクトルに由来します。別のことをします:
1つを(1x3)行列で割ったもの:
1/[1;1;1]
ans =
0.33333 0.33333 0.33333
同等:
([1/3;1/3;1/3] * 1)'
ans =
0.33333 0.33333 0.33333
要素の1つが負の場合はどうなりますか...
1/[1;1;-1]
ans =
0.33333 0.33333 -0.33333
同等:
([1/3;1/3;-1/3] * 1)'
ans =
0.33333 0.33333 -0.33333
これで、正方行列を指定しない場合にOctaveが何をするかについての一般的な考え方がわかりました。正方行列を渡すときにオクターブ行列の除算が何をするかを理解するには、逆関数が何をしているのかを理解する必要があります。
私は手作業でベクトルを正規化してきました。オクターブでそれらを実行したい場合は、パッケージを追加して実行できます。次のパッケージは、ベクトルの正規化で行ってきたことを実行すると思います。
http://octave.sourceforge.net/geometry/function/normalizeVector.html
これで、除算を同等の乗算に変換できます。行列の乗算がどのように機能するかについてのこの記事を読んでください。行列の除算の内部で何が起こっているのかをさかのぼって理解することができます。