Establecer valores de submatrices dentro de una matrizTengo una matriz de valores faltantes y quiero establecer la parte superior izquierda de esa matriz con valores de otra matriz.
initial_matrix=J(3,3,.);
update_matrix=[1 2, 3 4];
El resultado deseado es
[
1 2 .,
3 4 .,
. . .
]
Sé que podría iterar sobre los índices de la matriz de esta manera.
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)
¿Pero hay una forma más fácil y compacta de hacer esto utilizando referencia directa a los índices de la matriz?
Automatización y scriptingRe: Establecer valores de submatrices dentro de una matrizHola @MathStatChem ,
Puede que esto no sea tan elegante como lo que esperas, pero debería funcionar:
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];
Lo que da como resultado lo siguiente:
[1 2 .,
3 4 .,
. . .]
Creo que esto es lo que buscas. La indexación es [fila,n1::n2], por lo que [1,1::2] corresponde a los elementos 1 a 2 de la fila 1. La única desventaja es que debes saber de antemano a qué submatriz estás asignando los valores. Si no conoces esa información, un bucle sería una mejor solución.
¡Espero que esto ayude!
DS
Re: Establecer valores de submatrices dentro de una matrizEsto debería funcionar. La función Try() simplemente no asignará nada si la matriz de actualización no contiene la fila ni la columna.
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: Establecer valores de submatrices dentro de una matrizm = 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: Establecer valores de submatrices dentro de una matrizGracias @Craige_Hales , eso es lo que buscaba. Para simplificarlo, esto es lo que estoy haciendo.
m=J(7,8,99);
update=[41 42,
43 44,
45 46,
47 48
];
m[1::nrows(update), 1::ncols(update)]=update;
show(m);
resultado
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: Establecer valores de submatrices dentro de una matrizGracias. Nunca he usado Transform Each(), parece bastante útil y no habría pensado en usarlo en una matriz.
Re: Establecer valores de submatrices dentro de una matrizMi código debería modificarse ligeramente. Tal como está escrito, cualquier combinación de fila/columna que no esté en la matriz de actualización reemplazará el valor de la matriz inicial con el valor faltante. Try() debería tener una expresión Catch para evitar sobrescribir el valor, en caso de que el valor original no falte.
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 ) );