2015-10-15 5 views
5

私は、repmatとreshapeだけを使ってKron製品を複製しようとしています。私はかなり近いと思いますが、最後の正しい形にすることはできません。 は、特に私は、単純なLETものを作るためにMATLABのrepmatでKroneckerテンソルを複製する

Aを再形成に問題を抱えている私たちは、私のkron(A,B)は、4x4の行列になるだろう

A=[1 3; 2 4] 
B=[5 10; 10 5] 

があるとします。

Y=repmat(B,2,2) 
X=A(:); 
X=repmat(X,1,2)'; 
X=X(:); 
X=repmat(X,1,2); 

私に次の8x2マトリックス与えます:

X= [1 1 
    1 1 
    2 2 
    2 2 
    3 3 
    3 3 
    4 4 
    4 4] 

を私はちょうど得るために、正しいリシェイプを行う方法を見つけ出すことはできません

kron=[5 10 15 30 
     10 5 30 15 
     10 20 20 40 
     20 10 40 20] 

私はこの道を進んでいます私の4x4マトリックス:

X=[1 1 3 3 
    1 1 3 3 
    2 2 4 4 
    2 2 4 4] 

T私は計算することができるようになります編:X.*Y=kron(A,B)

+3

いつも次元2になるのですか? – BillBokeey

+0

'kron(A、B)'を実行しているときに '[5 10 15 30; 10 5 30 15; 10 20 20 40; 20 10 40 20] –

+0

@ m.s。 Uは正しいです、私は私のmatlabでYを反転し、私は今それを修正しています。 – Gio

答えて

4

ここbsxfunpermutereshapeの強力なトリオ使用して一つの手法だ - あなたが地獄ある場合

M = bsxfun(@times,B,permute(A,[3 4 1 2])); 
out = reshape(permute(M,[1 3 2 4]),size(A,1)*size(B,1),[]); 

repmatを使用してを曲げ、Mの計算を行いますそのように -

M = repmat(B,[1 1 size(A)]).*permute(repmat(A,[1 1 size(B)]),[3 4 1 2]) 

と比較して出力を確認してください一般的な行列サイズの0 -

>> A = rand(4,5); 
>> B = rand(6,7); 
>> M = bsxfun(@times,B,permute(A,[3 4 1 2])); 
>> out = reshape(permute(M,[1 3 2 4]),size(A,1)*size(B,1),[]); 
>> out_kron = kron(A,B); 
>> max(abs(out(:) - out_kron(:))) 
ans = 
    0 

ここmatrix-multiplicationを使用して1だと、このようなとしてはかなり効率的でなければならない -

[mA,nA] = size(A); 
[mB,nB] = size(B); 
out = reshape(permute(reshape(B(:)*A(:).',mB,nB,mA,nA),[1 3 2 4]),mA*mB,[]) 
+0

偉大な、それは私にとって完璧と思われ、あなたは 'bsxfun'を使わないで解決策を提供しました(そうでなければ、' kron'という組み込み関数にかなり戻っています)。 ありがとう、 G. – Gio

3

あなたが任意のループやbsxfun/arrayfunを使用しない場合 -

[ma,na] = size(A); 
[mb,nb] = size(B); 
Y = repmat(B,ma,mb); 
X = reshape(repmat(reshape(repmat(A(:),1,mb)',ma*mb,na),nb,1),ma*mb,na*nb); 
X.*Y 
+0

これはかなりきちんとしていて、まさに私がやろうとしていたものです。 repmatにちょうど固執し、形を変える。 – Gio

関連する問題