我需要2个for循环来填充Eigen中的矩阵,但我只能在Matlab中用1个for循环填充它-我可以摆脱额外的for循环吗?

我正在使用以下代码填充特征矩阵:

int M = 3;
int N = 4;
MatrixXd A(M, N);

double res = sin(4);

for (int i = 0; i < M; i++) {
    for (int j = 0; j < N; j++) {
        A(i, j) = sin(i+j);
    }
}

在 Matlab 中,我只需要 1 个 for 循环就可以使用矢量化来做同样的事情:

M = 3;
N = 4;
N_Vec = 0:(N-1);
A = zeros(M,N);
for i=1:M
    A(i,:) = sin((i-1)+N_Vec);
end

是否可以在 C++/Eigen 中做类似的事情,以便我可以摆脱 for 循环之一?如果有可能以某种方式摆脱两个 for 循环,那就更好了。那可能吗?

回答

使用 aNullaryExpr您可以在 Eigen 中使用零(手动)循环来执行此操作:

Eigen::MatrixXd A = Eigen::MatrixXd::NullaryExpr(M, N,
      [](Eigen::Index i, Eigen::Index j) {return std::sin(i+j);});

使用优化编译时,这不一定比手动双循环版本快(如果没有优化,它甚至可能更慢)。

您可以编写intlong代替Eigen::Index,如果它更具可读性...


以上是我需要2个for循环来填充Eigen中的矩阵,但我只能在Matlab中用1个for循环填充它-我可以摆脱额外的for循环吗?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>