2011-12-22 3 views
1
eigen2 사용

및 매트릭스에게두 개의 동적 RxC 행렬이 주어지면 어떻게 행을 인터리브하여 하나의 2RxC 행렬을 만들 수 있습니까?

a_0_0, a_0_1, a_0_2, ... 
a_1_0, a_1_0, a_1_2, ... 
... 

및 행렬 B 주어진다 :

b_0_0, b_0_1, b_0_2, ... 
b_1_0, b_1_1, b_1_2, ... 
... 

a 및 B의 크기가 동일한 경우, I가 생산, 행 인터리브하고자 :

a_0_0, a_0_1, a_0_2, ... 
b_0_0, b_0_1, b_0_2, ... 
a_1_0, a_1_0, a_1_2, ... 
b_1_0, b_1_1, b_1_2, ... 
... 

분명히 나는 ​​적절한 치수의 출력 행렬을 구성 할 함수를 작성한 다음 각 입력 행렬 결과에 요소를 할당하십시오. 차라리 휠을 다시 발명하지는 않을 것입니다. 그래서 eigen2가 이미 이런 종류의 행렬 수술을 우아하게 표현하는 메커니즘을 가지고 있다면, 나는 그것을 사용하는 것을 선호합니다.

나는 eigen2 문서를 살펴 봤지만 나에게 분명히 맞는 점은 하나도 없었다. 내가 찾은 가장 가까운 것은 MatrixBase :: select 였지만 'a 또는 b의 요소'는 '다음 행의 b의 요소에서'요소를 원합니다.

초기화시에만 빠른 경로에서이 작업을 수행 할 필요가 없기 때문에 효율성에 대한 중요한 관심사는 아닙니다.

매트릭스를 표현하는 더 좋은 방법이있는 경우 형식 지정에 대해 사과드립니다.

답변

2

각 RxC 행렬에 적절한 대각선의 0과 1로 구성된 2Rx 행렬을 곱한 다음 추가합니다.

매트릭스 1

1 0 0 0 ... 
0 0 0 0 ... 
0 1 0 0 ... 
0 0 0 0 ... 

매트릭스 2

0 0 0 0 ... 
1 0 0 0 ... 
0 0 0 0 ... 
0 1 0 0 ... 
+0

재미있는 생각, 내가 내부 크기가 일치하지 않는 때문에, 2RxR 매트릭스에 의해 RXC을 곱 및 수 없기 때문에 뭔가 약간 떨어져 보이지만 그들이 한 경우에도, 나는 것 2RxC가 아닌 RxR 결과를 얻습니다. 또한 'alternator'행렬을 작성하는 복잡성은 동일성 및 제로 행렬의 인터리브를 수행하는 것과 똑같은 복잡성을 가지므로 루프를 생성하려면 루프를 적어도 한 번 실행해야합니다. 그러나 나는 'alternator'행렬을 캐싱하고 다시 사용할 수 있기 때문에이 아이디어가 어디로가는 지 정말 좋아합니다. – acm

+0

매트릭스를 바꾸면 (예 : (매트릭스 1 * a) + (매트릭스 2 * b)) 효과가 있습니다. – MSN

+0

아 맞아. 내 선형 대수학 선생님이 어딘가에서 나를 엿 보았다. 감사. – acm

0

이 Eigen3에 고유 확실하지만, 당신이 MapStride 개체를 사용하여 행을 인터리브 수있는 것은 아닙니다.

MatrixXi C(A.rows()+B.rows(),A.cols()); 
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data(),A.rows(),A.cols(),Stride<Dynamic,2>(2*A.rows(),2)) = A; 
Map<MatrixXi,0,Stride<Dynamic,2> >(C.data()+1,B.rows(),B.cols(),Stride<Dynamic,2>(2*B.rows(),2)) = B; 

source