Imposta i valori della sottomatrice all'interno di una matriceHo una matrice di valori mancanti e voglio impostare la parte superiore sinistra di tale matrice sui valori di un'altra matrice.
initial_matrix=J(3,3,.);
update_matrix=[1 2, 3 4];
Il risultato desiderato è
[
1 2 .,
3 4 .,
. . .
]
So che potrei iterare sugli indici della matrice in questo modo
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)
ma esiste un modo più semplice e compatto per farlo utilizzando il riferimento diretto agli indici della matrice?
Automazione e scriptingRe: Imposta i valori della sottomatrice all'interno di una matriceCiao @MathStatChem ,
Forse non è elegante come speri, ma dovrebbe bastare:
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];
Che fornisce il seguente output:
[1 2 .,
3 4 .,
. . .]
Credo che questo sia ciò che potresti cercare. L'indicizzazione è [row,n1::n2], quindi [1,1::2] indica gli elementi da 1 a 2 della riga 1. L'unico inconveniente è che devi sapere in anticipo a quale sottomatrice stai assegnando i valori. Se non conosci questa informazione, il tuo ciclo sarebbe un approccio migliore.
Spero che questo ti aiuti!
DS
Re: Imposta i valori della sottomatrice all'interno di una matriceQuesto dovrebbe funzionare. Try() semplicemente non assegnerà nulla se la matrice di aggiornamento non contiene la riga e la colonna.
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 .,
//// . . .]
Re: Imposta i valori della sottomatrice all'interno di una matricem = 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];
Re: Imposta i valori della sottomatrice all'interno di una matriceGrazie @Craige_Hales , è proprio quello che cercavo. Per essere più generale, ecco cosa sto facendo.
m=J(7,8,99);
update=[41 42,
43 44,
45 46,
47 48
];
m[1::nrows(update), 1::ncols(update)]=update;
show(m);
risultato
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];
Re: Imposta i valori della sottomatrice all'interno di una matriceGrazie. Non ho mai usato Transform Each( ), sembra piuttosto utile e non avrei mai pensato di usarlo su una matrice.
Re: Imposta i valori della sottomatrice all'interno di una matriceIl mio codice dovrebbe essere modificato solo leggermente. Per come è scritto, qualsiasi combinazione riga/colonna non presente nella matrice di aggiornamento sostituirà il valore nella matrice iniziale con un valore mancante. Try() dovrebbe avere un'espressione Catch per impedire la sovrascrittura del valore, nel caso in cui il valore originale non sia mancante.
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 ) );