web-dev-qa-db-ja.com

MATLAB:同じ繰り返しブロックでブロック対角行列を作成します

行列[〜#〜] k [〜#〜]次元n x nがあります。新しいブロック対角行列を作成したい[〜#〜] m [〜#〜]次元N x Nで、d行列のブロック[〜#〜] k [〜#〜]対角線として。

dが小さければ、M = blkdiag(K、K、K)などを直接使用したでしょう。残念ながら、dは非常に大きいので、dとまったく同じ引数を使用して式を手動で記述したくありませんblkdiag()関数。

これを行うためのより短く、よりスマートな方法はありますか?

15
steadyfish

そのためにkronを使用できます。

M = kron(X,Y)

xとYのクロネッカーテンソル積を返します。結果は、Xの要素とYの要素の間のすべての可能な積を取ることによって形成された大きな配列です。Xがm行n列でYがp行q列の場合、 kron(X、Y)はm * p-by-n * qです。したがって、あなたの場合、このようなことが起こります:

M = kron(eye(L),K)

Lブロック数。

22
bla
tmp = repmat({K},d,1);
M = blkdiag(tmp{:});

Evalを使用したり、不必要にforループに入ったりしないでください。クロンはとてもエレガントな方法です。それも機能するので、これを共有したかっただけです。

2
Kzk

以下が機能するはずです。

d = 5; K = eye(3); T = cell(1、d);

j = 1:dの場合T {j} = K;終わり

M = blkdiag(T {:})

2
Feruza
s = 'A,';
s = repmat(s,[1,n2]);
s = ['B=blkdiag(', s(1:end-1),');'];
eval(s);

クロンアイを使用するよりも高速になる場合があります。

0
Edward Gong

「for」ループが役立つ場合があります。お気に入り:

M = k;
for i=1:N/n - 1
    M=blkdiag(M,k);
end
0
Arash Rouzi