设置矩阵内的子矩阵值我有一个缺失值矩阵,我想将该矩阵的左上部分设置为另一个矩阵中的值。
initial_matrix=J(3,3,.);
update_matrix=[1 2, 3 4];
期望的结果是
[
1 2 .,
3 4 .,
. . .
]
我知道我可以像这样迭代矩阵的索引
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)
但是,有没有一种更简单、更紧凑的方法来使用直接引用矩阵索引来实现这一点?
自动化和脚本回复:设置矩阵内的子矩阵值你好@MathStatChem ,
这可能不如您所希望的那么优雅,但它应该可以做到:
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];
输出结果如下:
[1 2 .,
3 4 .,
. . .]
我相信这可能就是你想要的。索引是 [row,n1::n2],所以 [1,1::2] 是第 1 行元素 1 到 2。唯一的缺点是你必须提前知道要将值赋给哪个子矩阵。如果你不知道这些信息,循环会是更好的方法。
希望这有帮助!,
DS
回复:设置矩阵内的子矩阵值这应该对你有用。如果更新矩阵不包含行和列,Try() 将不会分配任何内容。
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 .,
//// . . .]
回复:设置矩阵内的子矩阵值m = 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];
回复:设置矩阵内的子矩阵值谢谢@Craige_Hales ,这正是我想要的。为了更通用,我做了以下事情
m=J(7,8,99);
update=[41 42,
43 44,
45 46,
47 48
];
m[1::nrows(update), 1::ncols(update)]=update;
show(m);
结果
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];
回复:设置矩阵内的子矩阵值谢谢。我从来没用过Transform Each(),它看起来挺有用的,而且我之前从没想过在矩阵上用它。
回复:设置矩阵内的子矩阵值我的代码应该稍微修改一下。按照它的写法,任何不在更新矩阵中的行/列组合都会用缺失值替换初始矩阵中的值。Try() 应该有一个 Catch 表达式,以防止在原始值没有缺失的情况下覆盖该值。
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 ) );