Définir les valeurs des sous-matrices dans une matriceJ'ai une matrice de valeurs manquantes et je souhaite définir la partie supérieure gauche de cette matrice sur des valeurs d'une autre matrice.
initial_matrix=J(3,3,.);
update_matrix=[1 2, 3 4];
Le résultat souhaité est
[
1 2 .,
3 4 .,
. . .
]
Je sais que je pourrais itérer sur les indices de la matrice comme ceci
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)
mais existe-t-il un moyen plus simple et plus compact de le faire en utilisant le référencement direct des indices de la matrice ?
Automatisation et scriptsRé : Définir les valeurs des sous-matrices dans une matriceBonjour @MathStatChem ,
Ce n'est peut-être pas aussi élégant que vous l'espérez, mais cela devrait le faire :
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];
Ce qui vous donne le résultat suivant :
[1 2 .,
3 4 .,
. . .]
Je pense que c'est ce que vous recherchez. L'indexation est [row,n1::n2], donc [1,1::2] correspond aux éléments 1 à 2 de la ligne 1. Le seul inconvénient est qu'il faut savoir à l'avance à quelle sous-matrice attribuer les valeurs. Si vous ne connaissez pas cette information, votre boucle serait une meilleure approche.
J'espère que cela aide !,
DS
Ré : Définir les valeurs des sous-matrices dans une matriceCela devrait fonctionner. Try() n'affectera rien si la matrice de mise à jour ne contient pas la ligne et la colonne.
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 .,
//// . . .]
Ré : Définir les valeurs des sous-matrices dans une 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];
Ré : Définir les valeurs des sous-matrices dans une matriceMerci @Craige_Hales , c'est ce que je cherchais. Pour simplifier, voici ce que je fais.
m=J(7,8,99);
update=[41 42,
43 44,
45 46,
47 48
];
m[1::nrows(update), 1::ncols(update)]=update;
show(m);
résultat
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];
Ré : Définir les valeurs des sous-matrices dans une matriceMerci. Je n'ai jamais utilisé Transform Each( ), cela semble assez utile, et je n'aurais pas pensé l'utiliser sur une matrice.
Ré : Définir les valeurs des sous-matrices dans une matriceMon code devrait être légèrement modifié. Tel qu'il est écrit, toute combinaison ligne/colonne non présente dans la matrice de mise à jour remplacera la valeur de la matrice initiale par une valeur manquante. La fonction Try() devrait contenir une expression Catch pour éviter d'écraser la valeur, au cas où la valeur d'origine serait correcte.
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 ) );