Erstellen einer Blockmatrix aus Arrays von Blöcken
Ich versuche eine Matrix aus quadratischen Blöcken zu erzeugen. Tatsächlich habe ich eine$n×n$ Matrixpolynom $P(l)$, das $qth$ Ableitung von $P(l)$ in Gedenken an $l$, was mit bezeichnet wird $P^{(q)} (l)$und ein Block von Nullen, den ich einfach aufrufen werde $0$. Ich habe eine ganze Zahl$k$ so dass wenn $k=1$ dann generiere ich die Matrix
$$ R= \begin{pmatrix} P(l) \end{pmatrix} $$
Wenn $k=2$ dann sollte ich generieren
$$ R = \begin{pmatrix} P(l) & 0 \\ \frac{1}{1!} P^{(1)}(l) & P(l) \end{pmatrix} $$
Wenn $k=3$ dann
$$ R = \begin{pmatrix} P(l) & 0 & 0 \\ \frac{1}{1!} P^{(1)}(l) & P(l) & 0 \\ \frac{1}{2!} P^{(2)}(l) & \frac{1}{1!} P^{(1)}(l) & P(l) \end{pmatrix} $$
und so weiter. Allgemein,
$$ R = \begin{pmatrix} P(l) & 0 & \cdots & 0 & 0 \\ \frac{1}{1!} P^{(1)}(l) & P(l) & \cdots & 0 & 0 \\ \frac{1}{2!} P^{(2)}(l) & \frac{1}{1!} P^{(1)}(l) & \cdots & 0 & 0 \\ \vdots & \vdots & \ddots & \vdots & \vdots \\ \frac{1}{(k-1)!} P^{(k-1)}(l) & \frac{1}{(k-2)!} P^{(k-2)}(l) & \cdots & \frac{1}{1!} P^{(1)}(l) & P(l) \end{pmatrix} $$
ist ein $nk×nk$ Matrix.
Ich bevorzuge einen einfachen und verständlichen Weg und dachte dafür, mit einer Nullmatrix zu beginnen $R$ von Dimensionen $nk×nk$und dann mit zwei "for" -Schleifen, um die anfängliche Nullmatrix zu füllen, wobei die entsprechende Ableitung gesetzt wird, die benötigt wird. Ich bin mir nicht sicher, was als meine Aussage in "for" -Schleifen gehen soll. Ich fand andere Fragen, die ähnlich, aber komplizierter und spezifischer waren. Jede Hilfe geschätzt, danke.
Antworten
Aufgrund der Bandstruktur Ihrer Matrix können Sie die undokumentierte Funktion SparseArray`SparseBlockMatrixdafür wie folgt verwenden (hier mit einer Dummy-Matrixwertfunktion P):
P[i_, l_, n_] := ConstantArray[l, {n, n}];
R[k_, l_, n_] := SparseArray`SparseBlockMatrix[
Table[Band[{i, 1}] -> 1/i! P[i, l, n], {i, 1, k}],
{k, k}
]
Beispiel R[4, ell, 3]erzeugt eine Matrix der Größe {12, 12}mit Blockeinträgen durch die Funktion festgelegt P.
Zuerst brauchen wir die gleichen Daten. Ich bezeichne dein "P (l)" bl p [l] und "P ^ (1)" mit der [n, p, x]. Dann definiere ich eine Funktion "makeblmat", die die Blockmatrix zusammensetzt:
m = Table[RandomInteger[{-10, 10}], 2, 2];
p[x_] = Sum[MatrixPower[m, i] x^i, {i, 0, 2}];
derp[n_, p_, x_] := D[p, {x, n}];
makeblmat[k_] :=
Table[If[i >= j, derp[i - j, p[x], x]/! (i - j), 0], {i, k}, {j, k}]//ArrayFlatten;
MatrixForm[makeblmat[2]]