Учитывая две динамические матрицы R x C, как я могу чередовать строки, чтобы получить одну матрицу 2R x C? - PullRequest
1 голос
/ 22 декабря 2011

Использование eigen2 и заданная матрица A

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 имеют одинаковые размеры, я хотел бы чередовать строки, получая:

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», где то, что я хочу, это «элемент из элемента then из следующей строки».

Эффективность не имеет первостепенного значения, поскольку мне не нужно делать это на быстром пути, только при инициализации.

Прошу прощения за форматирование, если есть лучший способ представления матриц.

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Умножьте каждую матрицу R x C на матрицу 2R x R, состоящую из нулей и единиц на соответствующей диагонали, затем добавьте.

Матрица 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 голосов
/ 11 декабря 2013

Не уверен, относится ли это к Eigen3, но вы можете чередовать строки, используя объекты Map и Stride.

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;

источник

...