行列内のサブ行列値を設定する欠損値の行列があり、その行列の左上部分を別の行列の値に設定したいと考えています。
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)
しかし、行列インデックスを直接参照してこれを行う、より簡単でコンパクトな方法はありますか?
自動化とスクリプトRe: 行列内のサブ行列値を設定するこんにちは、 @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 .,
. . .]
これがあなたが探しているものだと思います。インデックスは[行,n1::n2]なので、[1,1::2]は1行目の要素1~2を表します。唯一の欠点は、値を代入する部分行列を事前に知っておく必要があることです。その情報がわからない場合は、ループを使用する方がよいでしょう。
これが役に立つことを願っています!
DS
Re: 行列内のサブ行列値を設定するこれでうまくいくはずです。更新行列に行と列が含まれていない場合、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 .,
//// . . .]
Re: 行列内のサブ行列値を設定する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];
Re: 行列内のサブ行列値を設定する@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];
Re: 行列内のサブ行列値を設定するありがとうございます。Transform Each() を使ったことはありませんが、とても便利そうです。行列で使うとは思いませんでした。
Re: 行列内のサブ行列値を設定するコードを少し変更する必要があります。現在の記述では、更新行列に含まれない行と列の組み合わせは、初期行列の値を欠損値に置き換えてしまいます。元の値が欠損値でない場合に備えて、Try() にキャッチ式を追加して、値の上書きを防ぐ必要があります。
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 ) );