行列のリストからブロック対角行列を作成するにはどうすればよいですか?



How Form Block Diagonal Matrix From List Matrices

解決:

ybeltukovのblockArray fromブロック対角行列の生成を高速化すると、パフォーマンスの観点から、以下のメソッドが桁違いに水から吹き飛ばされます。


a = {{1、2、3}、{4、5、6}、{7、8、9}}; b = {{1、2}、{3、4}}; ArrayFlatten [{{a、0}、{0、b}}] // MatrixForm

Mathematicaグラフィックス



あなたはできるこの操作を行列のリストに重ねて、対角線を取得します。

a = {{1、2、3}、{4、5、6}、{7、8、9}}; b = {{1、2}、{3、4}}; c = {{1、2、3}、{4、5、6}}; d = {{1、2}、{3、4}、{5、6}}; Fold [ArrayFlatten [{{#、0}、{0、#2}}]&、a、{b、c、d}] // MatrixForm

Mathematicaグラフィックス



これを行う別の方法があります。任意のヘッドを使用した対角行列(ホールド)上にリスト:

DiagonalMatrix [Hold / @ {a、b、c、d}] // ReleaseHold // ArrayFlatten // MatrixForm 

(同じ出力)

またはもう少しきれいに使用して評価されていません(ただし、マトリックスリストの要素には名前が付けられていない可能性があるため、対話型入力とは対照的に、これをプログラムに適用するのは難しい場合があります):



DiagonalMatrix [Unevaluated @ {a、b、c、d}] // ArrayFlatten // MatrixForm 

(同じ出力)


アップデート: ちょうどこれにぶつかった:SparseArray`SparseBlockMatrix:

bmF = With [{r = MapIndexed [#2 [[1]] {1、1}->#&、#、1]}、SparseArray`SparseBlockMatrix [r]]&; a = {{1、2、3}、{4、5、6}、{7、8、9}}; b = {{1、2}、{3、4}}; c = {{x、y、z}、{u、v、w}}; bmF [{a、b、c}] // MatrixForm

Mathematicaグラフィックス

元の投稿:

diagF = With [{dims = [email protected](Dimensions / @ {##})}、SparseArray [Band [{1、1}、dims]-> {##}、dims]]&;

編集:はるかにエレガントなフォーム(Mr.Wizardのおかげで)

diagF = SparseArray [Band [{1、1}]-> {##}]&

例:

a = {{1、2、3}、{4、5、6}、{7、8、9}}; b = {{1、2}、{3、4}}; c = {{1、2、3}、{4、5、6}}; d = {{1、2}、{3、4}、{5、6}}; diagF [a、b、d、b、c] // MatrixForm

ここに画像の説明を入力してください



a = {{1、2、3}、{4、5、6}、{7、8、9}}; b = {{1、2}、{3、4}}; SparseArray [Band [{1、1}]-> {a、b}] // MatrixForm

ここに画像の説明を入力してください