Festlegen von Submatrixwerten innerhalb einer MatrixIch habe eine Matrix mit fehlenden Werten und möchte den oberen linken Teil dieser Matrix auf Werte in einer anderen Matrix setzen.
initial_matrix=J(3,3,.);
update_matrix=[1 2, 3 4];
Das gewünschte Ergebnis ist
[
1 2 .,
3 4 .,
. . .
]
Ich weiß, dass ich die Indizes der Matrix folgendermaßen iterieren könnte
for(i=1, i<=N rows(update_matrix), i++,
for(k=1, k<=N cols(update_matrix), k++,
initial_matrix[i,k]=update_matrix[i,k]
)
);
Show(initial_matrix)
aber gibt es eine einfachere und kompaktere Möglichkeit, dies durch direkte Referenzierung der Matrixindizes zu tun?
Automatisierung und SkriptingBetreff: Submatrixwerte innerhalb einer Matrix festlegenHallo @MathStatChem ,
Dies ist möglicherweise nicht so elegant, wie Sie es sich erhoffen, aber es sollte funktionieren:
initial_matrix = J(3,3,.);
update_matrix=[1 2, 3 4];
initial_matrix[1,1::2]=update_matrix[1,1::2];
initial_matrix[2,1::2]=update_matrix[2,1::2];
Dadurch erhalten Sie die folgende Ausgabe:
[1 2 .,
3 4 .,
. . .]
Ich glaube, das ist genau das, wonach Sie suchen. Die Indizierung lautet [Zeile, n1::n2], also entspricht [1,1::2] den Elementen 1 bis 2 von Zeile 1. Der einzige Nachteil ist, dass Sie vorher wissen müssen, welcher Submatrix Sie die Werte zuweisen. Wenn Sie diese Informationen nicht kennen, wäre Ihre Schleife der bessere Ansatz.
Hoffe, das hilft!,
DS
Betreff: Submatrixwerte innerhalb einer Matrix festlegenDies sollte für Sie funktionieren. Try() weist einfach nichts zu, wenn die Aktualisierungsmatrix die Zeile und Spalte nicht enthält.
Names Default To Here( 1 );
im = J( 3, 3, . );
um = [1 2, 3 4];
im = Transform Each( {e, {r, c}}, im, Try( um[r, c] ) );
//// [1 2 .,
//// 3 4 .,
//// . . .]
Betreff: Submatrixwerte innerhalb einer Matrix festlegenm = j(7,8,99);
m[2::5,3::4] = [
41 42,
43 44,
45 46,
47 48
];
show(m)
m =
[ 99 99 99 99 99 99 99 99,
99 99 41 42 99 99 99 99,
99 99 43 44 99 99 99 99,
99 99 45 46 99 99 99 99,
99 99 47 48 99 99 99 99,
99 99 99 99 99 99 99 99,
99 99 99 99 99 99 99 99];
Betreff: Submatrixwerte innerhalb einer Matrix festlegenDanke @Craige_Hales , das habe ich gesucht. Um es allgemeiner zu machen, hier ist, was ich mache
m=J(7,8,99);
update=[41 42,
43 44,
45 46,
47 48
];
m[1::nrows(update), 1::ncols(update)]=update;
show(m);
Ergebnis
m =
[ 41 42 99 99 99 99 99 99,
43 44 99 99 99 99 99 99,
45 46 99 99 99 99 99 99,
47 48 99 99 99 99 99 99,
99 99 99 99 99 99 99 99,
99 99 99 99 99 99 99 99,
99 99 99 99 99 99 99 99];
Betreff: Submatrixwerte innerhalb einer Matrix festlegenDanke. Ich habe Transform Each( ) noch nie verwendet, sieht ziemlich nützlich aus und hätte nicht gedacht, dass ich das auf einer Matrix verwenden würde.
Betreff: Submatrixwerte innerhalb einer Matrix festlegenMein Code sollte nur geringfügig geändert werden. So wie er geschrieben ist, ersetzt jede Zeilen-/Spaltenkombination, die nicht in der Aktualisierungsmatrix enthalten ist, den Wert in der ursprünglichen Matrix durch einen fehlenden Wert. Try() sollte einen Catch-Ausdruck enthalten, um das Überschreiben des Werts zu verhindern, falls der ursprüngliche Wert nicht fehlt.
Names Default To Here( 1 );
im = J( 3, 3, 5 );
um = [1 2, 3 4];
im = Transform Each( {e, {r, c}}, im, Try( um[r, c], e ) );