0

サイズの異なる2つの行列があります。行列{a}をa(1:10)<10 x 1>として定義し、行列{b}をb(6:10)<5x1>として定義しましょう。行列{a}と{b}の違いを取得するforループまたは同等のもの(bsxfun)が必要です。コードは、行列{b}のサイズに基づいて反復されます。たとえば、行列{a}の最初の値は1で、コードはすべての行列{b}値の差を取得します。したがって、合計5回実行されます。行列{a}の次の値は2で、コードは5回繰り返されます。コードは、値10である行列{a}の終わりまで繰り返されます。

可能であれば、bsxfunを使用しないforループと、bsxfunを使用するforループの両方を記述して、値にインデックスを付ける方法を説明できます。また、私の啓蒙のために、2つの行列ではなく、N個の行列(N> 2)がある場合、コードはどのように変化しますか?

ありがとうございました。

4

2 に答える 2

2

これがループソリューションとrepmatソリューションです。

%いくつかのサンプルデータを定義します。

編集: abは列ベクトルであり、行ベクトルではありません。

a = [ 1:10 ]';

b = [ 6:10 ]';5:10の垂直方向のサイズは5ではなく6であるため、質問に一致するように6:10使用されます。

まず、非常に基本的なループソリューションです。すべてaIndexbIndexペアをループし、でアドレス指定された要素の差を減算し、結果aIndexbIndexに格納しLoopDifferenceMatrix(aIndex, bIndex)ます。

for aIndex = 1:size(a,1)
    for bIndex = 1:size(b,1)
        LoopDifferenceMatrix(aIndex, bIndex) = a(aIndex) - b(bIndex);
    end
end

これは代替repmatソリューションです。aを使用して、水平方向のサイズが(の水平方向のサイズ)とrepmat一致するように水平方向に複製します。次に、を使用して垂直方向に転置を複製し、垂直方向のサイズが(の元の水平方向のサイズ)と一致するようにします。レプリケートからレプリケートを減算し、結果をに格納します。size(b,1)bbrepmatsize(a,1)aabDifferenceMatrix

DifferenceMatrix = repmat(a, 1, size(b,1)) - repmat(b', size(a,1), 1);

DifferenceMatrix =
-5    -6    -7    -8    -9
-4    -5    -6    -7    -8
-3    -4    -5    -6    -7
-2    -3    -4    -5    -6
-1    -2    -3    -4    -5
 0    -1    -2    -3    -4
 1     0    -1    -2    -3
 2     1     0    -1    -2
 3     2     1     0    -1
 4     3     2     1     0 

isequal(DifferenceMatrix, LoopDifferenceMatrix)
ans =
1
于 2012-06-14T07:30:35.393 に答える
1

これはあなたがやろうとしていることですか?

a = 1:10;
b = 6:10;
c = zeros(length(b),length(a));
d = zeros(length(b),length(a));

for n = 1:length(b)
    c(n,:) = bsxfun(@minus,a,b(n));
    d(n,:) = a - b(n);
end

N個の行列でそれを行う方法については、N番目の行列で何をしたいかを指定する必要があります。

于 2012-06-14T07:42:12.117 に答える