Собственная индексация, обновить все столбцы определенной строки - PullRequest
0 голосов
/ 21 декабря 2018

Допустим, у меня есть ArrayXXf (или MatrixXf) m.В каждой итерации цикла for я хочу заполнить m построчно VectorXf.

Eigen::ArrayXXf m(5, 5);

for (int i = 0; i < 5; i++)
{
    Eigen::VectorXf vec(5);
    vec << i, i + 1, i + 2, i+3, i+4;

    //fill m row wise
    // in matlab I will do something like m(i,:) = vec; 
    // in numpy this will looks like m[i:] = vec;
    // that means when i is 0 m looks like 
    //          [ 0 1 2 3 4 5
    //           -  - - - - -
    //           -  - - - - -
    //           -  - - - - -
    //           -  - - - - -]
}

Как мне добиться этого в Eigen?

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Чтобы упростить ответ @ Кунала, вы можете напрямую изменять строки (или столбцы) массива (или матрицы) без создания временного вектора.В вашем примере вы можете использовать .setLinSpaced():

Eigen::ArrayXXf m(5, 5);

for (int i = 0; i < 5; i++) {
    m.row(i).setLinSpaced(i,i+4); //.col(i) would be slightly more efficient
}

или использовать инициализатор запятой:

for (int i = 0; i < 5; i++) {
    m.row(i) << i, i+1, i+2, i+3, i+4;
}
0 голосов
/ 21 декабря 2018

Используйте функцию block ().

#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main()
{
    Eigen::ArrayXXf m(5, 5);

    for (int i = 0; i < 5; i++) {
        Eigen::VectorXf vec(5);
        vec << i, i + 1, i + 2, i+3, i+4;

        m.block(i, 0, 1, 5) << vec.transpose();
    }

    std::cout << m << std::endl;
    return 0;
}

Вывод:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

Редактировать:

Существует также одна более простая альтернатива:Функция row ().

#include <iostream>
#include <Eigen/Dense>

using namespace std;

int main()
{
    Eigen::ArrayXXf m(5, 5);

    for (int i = 0; i < 5; i++) {
        Eigen::VectorXf vec(5);
        vec << i, i + 1, i + 2, i+3, i+4;

        m.row(i) = vec.transpose();
    }

    std::cout << m << std::endl;
    return 0;
}

Вывод:

0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8

PS transpose () требуется, поскольку Eigen :: VectorXf по умолчанию является вектором столбца, не вектор строки.

...