2016-10-16 2 views
1

Я уже давно искал походы в Google, но не могу найти ответ на этот простой вопрос.Собственная экстракционная подматрица из вектора индексов

В MATLAB я могу это сделать:

rows = [1 3 5 9]; 
A = rand(10); 
B = A(rows, :); 

Как мне это сделать по собственным? Не похоже, что это возможно. Самая близкая вещь, которую я нашел, -

MatrixXd a(10,10); 
a.row(1); 

, но я хочу получить несколько строк/столбцов. Другой пользователь также задал вопрос здесь: How to extract a subvector (of a Eigen::Vector) from a vector of indices in Eigen?, но я думаю, что это должно быть сделано, потому что это действительно общая операция, я думаю.

Спасибо.

ответ

1

К сожалению, это по-прежнему не поддерживается напрямую даже в Eigen 3.3. Там было это запрос функции на некоторое время: http://eigen.tuxfamily.org/bz/show_bug.cgi?id=329

Гаэль связан с примером реализации в одном из комментариев там: http://eigen.tuxfamily.org/dox-devel/TopicCustomizing_NullaryExpr.html#title1

0

Ok, скажем, например, у вас есть матрица 3х3:

m = [3 -1 1; 2.5 1.5 6; 4 7 1] 

и сказать, что вы хотите извлечь следующие строки из т матрицы:

[0 2], // row 0 and row 2 

по существу выдавая следующую матрицу:

new_extracted_matrix = [3 -1 1; 4 7 1] // row 0 and row 2 of matrix m 

Главное здесь, давайте создадим вектор v, имеющие содержание [0 2], означает, что мы бы извлечь следующие индексы строк из матрицы т. Вот что я сделал:

#include <iostream> 
#include <Eigen/Dense> 
using namespace Eigen; 
using namespace std; 
int main() 
{ 
    Matrix3f m; 
    m(0,0) = 3; 
    m(0,1) = -1; 
    m(0,2) = 1; 
    m(1,0) = 2.5; 
    m(1,1) = m(1,0) + m(0,1); 
    m(1,2) = 6; 
    m(2,0) = 4; 
    m(2,1) = 7; 
    m(2,2) = 1; 
    std::cout << "Here is the matrix m:\n" << m << std::endl; // Creating a random 3x3 matrix 
    VectorXf v(2); 
    v(0) = 0; // Extracting row 0 
    v(1) = 2; // Extracting row 2 

    MatrixXf r(1,v.size()); 
    for (int i=0;i<v.size();i++) 
    { 
     r.col(i) << v(i); // Creating indice vector 
    } 
    cout << "The extracted row indicies of above matrix: " << endl << r << endl; 

    MatrixXf N = MatrixXf::Zero(r.size(),m.cols()); 
    for (int z=0;z<r.size();z++) 
    { 
    N.row(z) = m.row(r(z)); 
    } 

    cout << "Extracted rows of given matrix: " << endl << N << endl; 
} 

Это даст нам следующий вывод:

Вот матрица м: [3 -1 1; 2,5 1,5 6; 4 7 1]

Извлеченные строки indicies приведенной выше матрицы: [0 2]

Извлеченные строки данной матрицы: [3 -1 1; 4 7 1]

Смежные вопросы