行列のリストからブロック対角行列を作成するにはどうすればよいですか?
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 
あなたはできるこの操作を行列のリストに重ねて、対角線を取得します。
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 
これを行う別の方法があります。任意のヘッドを使用した対角行列(ホールド)上にリスト:
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 
元の投稿:
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 