5

次元を持つ 3 次元 (または一般的には n 次元) の行列Aがあります。

size(A) = [d1 d2 d3 ... dn]. 

ここで、次元の 1 つで列ベクトルを使用してベクトル乗算を実行したいと考えていますv(2 次元で行うように、ベクトルが返される場合 - たとえば、d1 = 2d3 = 4およびsize(v) = d2)。

(A*d)_i = sum(a_ij*v_j). 

したがって、1次元減らしたいと思います。

d3次元の列ベクトル vを返す Matlab 関数 (ループ以外) はありますか

(A*v)_ij = sum(A_ijk*v_k). 

これが明確だったことを願っています。

ありがとう!

4

2 に答える 2

3

reshapeいくつかの 'sを使用してそれを行うことができます。

A=rand(2,3,4);
v=rand(1,4);
reshape(reshape(A,[size(A,1)*size(A,2),size(A,3)])*v,[size(A,1) size(A,2)])

基本的に、A を 2D 行列 A2((ij),(k))=A((i),(j),(k)) に再形成します。

A2=reshape(A,[size(A,1)*size(A,2),size(A,3)])

次に、通常の乗算​​を行います。

すべての (ij) B2((ij))=sum_k A2((ij),(k))*v((k)):

B2=A2*v

あなたが元に戻す:

B((i),(j))=B((ij))

B=reshape(B2,[size(A,1) size(A,2)])

これが明確であることを願っています

于 2012-10-21T16:11:16.283 に答える
3

もう少しスムーズにできます。行列の場合reshape、引数は 1 つしか必要ありません。もう 1 つの引数は、指定されていない場合は自動的に計算されます。これはまさにそのような状況で非常に役立ちます。

したがって、Oli によって提示されたソリューションは、次のように簡潔に記述できます。

A = rand(2,3,4);
v = rand(4,1);

A2 = reshape(A, [], numel(v));      % flatten first two dimensions
B2 = A2*v;
B  = reshape(B2, size(A, 1), []);
于 2012-10-21T16:50:53.743 に答える