2016-07-19 3 views
0

のために私はこのようなコードを持っていなくて、同じコマンドを数回繰り返すことによって行列を作成します。MATLABはループ

A = [sparse(round(rand(4,4)))]; 
B = [sparse(round(rand(1,4)))]; 
C = [bsxfun(@minus,A(1,:),B); bsxfun(@minus,A(2,:),B); bsxfun(@minus,A(3,:),B); bsxfun(@minus,A(4,:),B);] 

は、ですが(何らかの形で大量の行に対してCをこのように定義することは可能であるが、私は物理的にできないようにこの方法でコマンドを出力してください)ループなし(ループが長すぎる時間がかかるため)

答えて

2

一つ別のオプション:

あなたが疎行列を維持することを好む場合:

C = A - repmat(B,size(A,1),1); %but slower than the bsxfun version. 
+0

サイズが一致する必要があるため、一番上のものは失敗します。 (行列がいっぱいであるかまばらであるかは、ここでは無関係です)。 –

+0

@TasosPapastylianouだから、オクターブだけがこの "行の賢明な"操作を管理できますか? – obchardon

+0

ああ、はい。オクターブは実際にこのような状況で "放送"を行いますが、matlabには特別な指示が必要です。 –

2

あなたはマトリックスとbsxfunに行ベクトルを渡すと、それは自動的にこれだけ使い、行列のすべての行にベクトルを適用します。

C = bsxfun(@minus, A, B); 

この全ての行に行ベクトルBをsubstractますあなたが持っている行の数にかかわらず、行列Aの

編集:行列とベクトルの代わりに2つの行列がある場合は、置換またはのいずれかを使用できます。

Multiply all columns of one matrix by another matrix with bsxfun

+0

ありがとう、だけでなく、場合Bが行列であると私は希望を見てみましょうBのすべてのベクトルにbsx関数を適用するのは、ちょうどあなたがもう正しくないと言ったものです、それは? – Patapunfate

+0

次に、順列を使用して、回答の中で自分の編集を見てみることができます。 –

+0

ところで、既に別の回答を受け入れたとマークした場合は、すでに問題を解決したことを意味します。 –