1
A = [1 2 3; 7 6 5]
B = [3 7];
A-B = [1-3 2-3 3-3; 7-7 6-7 5-7];
ans =[-2 -1 0; 0 -1 -2]

これが私がやりたい操作です。反復解法以外の行列関数でそれを行うにはどうすればよいですか?

4

3 に答える 3

3

これは、サイズが一致するように配列を自動的に拡張するで最も便利にbsxfun実行できます(したがって、を使用する必要はありませんrepmat)。B2行1列の配列になるように転置する必要があることに注意してください。

A = [1 2 3; 7 6 5]
B = [3 7];

result = bsxfun(@minus,A,B')

result =

-2    -1     0
 0    -1    -2
于 2012-11-15T17:39:29.683 に答える
2

ジョナスの答えが一番いいと思います。しかし、念のために、明示的なものを使用した解決策を次に示しますrepmat

A = [1 2 3; 7 6 5];
B = [3 7];

sz = size(A);
C = A - repmat(B', [1 sz(2:end)]);

Jonasの答えは単純であるだけでなく、私のマシン上の大きな行列の場合、実際には2倍速くなります。

Aがnd配列である場合、これらのソリューションはどちらも非常に合理的なことを行うことに注意することも興味深いです。マトリックスCには次のプロパティがあります。

C(k,:,...,:) == A(k,:,...,:) - B(k)

実際、Bがmdの場合、の初期次元が同じサイズAである限り、Jonasの答えは実行され、おそらくあなたが望むことを実行します。B'これを模倣するようにrepmatソリューションを変更できます...その時点で再実装を開始しますbsxfun

于 2012-11-15T21:03:27.667 に答える
1

通常はできません。問題が十分に定義されていないため、反復的な解決策が必要になります。行列の加算/減算は、同じ次元の行列に対してのみ定義されます。

すなわち:

A =         | 1 2 3 |
            | 7 6 5 |

B =         | 3 7 |

2x3行列から1x2行列を引くことは意味がありません。

ただし、Bに中間行列を掛けて結果を2x3行列にすると、次のように機能します。

B' * Y =    | 3 3 3 |
            | 7 7 7 |

例えば:

B' =        diag(B)
   =        | 3 0 |
            | 0 7 |


B' * Y =    | 3 3 3 |
            | 7 7 7 |

Y =         | 1 1 1 |
            | 1 1 1 |

したがって、A-B'*Y有効な非反復ソリューションを提供します。

A-(B'*Y) =      | 1 2 3 |  -  | 3 3 3 |
                | 7 6 5 |     | 7 7 7 |

         = A - (diag(B) * Y )

ここでの唯一の「チート」はdiag()、ベクトルを厳密な対角行列に変換する関数の使用です。行列/ベクトルの乗算演算のセットを手動で分解して関数を手動で再作成する方法がありdiag()ますが、それは上記のソリューションよりも手間がかかります。

幸運を!

于 2012-11-15T17:27:24.530 に答える