행렬 내에서 부분 행렬 값 설정누락된 값의 행렬이 있는데, 해당 행렬의 왼쪽 위 부분을 다른 행렬의 값으로 설정하고 싶습니다.
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: 행렬 내에서 부분 행렬 값 설정안녕하세요 @매스스탯켐 ,
이는 여러분이 바라는 만큼 우아하지는 않을지 몰라도, 그 기능은 갖춰야 합니다.
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번까지의 요소를 나타냅니다. 유일한 단점은 값을 할당할 부분 행렬을 미리 알아야 한다는 것입니다. 이 정보를 모른다면 루프를 사용하는 것이 더 나은 방법입니다.
도움이 되길 바랍니다!
디에스
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() 함수에는 원래 값이 누락되지 않은 경우 값을 덮어쓰지 않도록 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 ) );