Собственный столбец увеличения на единицу

Как увеличить столбец динамической матрицы на единицу в качестве операции на месте (без создания копий/промежуточных звеньев)?

Пытаться:

#include <Eigen/Dense>
#include <iostream>
#include <stdint.h>
int main(void){
    Eigen::MatrixXf A;
    A = Eigen::MatrixXf::Random(3, 5);
    std::cout << A << std::endl << std::endl;
    A.col(1) = A.col(1)*2; //this works.
    A.col(1) = A.col(1) + 1; //this doesn't work.
    std::cout << A << std::endl;
}

person hamster on wheels    schedule 03.10.2016    source источник


Ответы (1)


Я нашел способ сделать это. Но я не знаю, есть ли операция.

Это похоже на eigen: вычитание скаляра из вектора

#include <Eigen/Dense>
#include <iostream>
int main(void){
    Eigen::MatrixXf A;
    A = Eigen::MatrixXf::Random(3, 5);
    std::cout << A << std::endl << std::endl;

    A.col(1) = A.col(1)*2;
    A.col(1) = A.col(1) + Eigen::VectorXf::Ones(3);
    std::cout << A << std::endl;
}

Другой способ - использовать операцию массива. Этот способ кажется лучше (я думаю).

https://eigen.tuxfamily.org/dox/group__TutorialArrayClass.html

#include <Eigen/Dense>
#include <iostream>
int main(void){
    Eigen::MatrixXf A;
    A = Eigen::MatrixXf::Random(3, 5);
    std::cout << A << std::endl << std::endl;

    A.array() += 1;
    A.col(1).array() += 100;

    std::cout << A << std::endl;
}
person hamster on wheels    schedule 03.10.2016
comment
Я бы рекомендовал использовать подход array(). Если вы в основном выполняете поэлементные операции, рассмотрите возможность сохранения A как Eigen::ArrayXXf с самого начала. Позже вы все еще можете получить доступ к A как к матрице с помощью метода matrix(). - person chtz; 03.10.2016