特征索引,更新特定行的所有列 [英] Eigen indexing, update all column of a specific row

查看:62
本文介绍了特征索引,更新特定行的所有列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个 ArrayXXf (或 MatrixXf ) m .在for循环的每次迭代中,我都想用 VectorXf 逐行填充 m .

Let say I have an ArrayXXf (or MatrixXf) m. In each iteration of a for loop, I want to fill m row-wise with a 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中实现这一目标?

How can I achieve that in Eigen?

推荐答案

使用block()函数.

Use block() function.

#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()函数.

There is one simpler alternative also: row() function.

#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

P.S.transpose()是必需的,因为默认情况下Eigen :: VectorXf是列向量,不是行向量.

P.S. transpose() is required because Eigen::VectorXf by default is a column vector, not a row vector.

这篇关于特征索引,更新特定行的所有列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆