我需要 2 个 for 循环来填充 Eigen 中的矩阵,但在 Matlab 中我只能用 1 个 for 循环填充它 - 我可以去掉额外的 for 循环吗?
I need 2 for loops to fill a matrix in Eigen but I can fill it with only 1 for loop in Matlab - can I get rid of the extra for loop?
我正在用以下代码填充特征矩阵:
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 循环,那就更好了。这可能吗?
使用 NullaryExpr
你可以在 Eigen 中使用零(手动)循环来做到这一点:
Eigen::MatrixXd A = Eigen::MatrixXd::NullaryExpr(M, N,
[](Eigen::Index i, Eigen::Index j) {return std::sin(i+j);});
经过优化编译后,这不一定比手动双循环版本快(不经过优化甚至可能更慢)。
您可以写 int
或 long
而不是 Eigen::Index
,如果那样更易读的话...
我正在用以下代码填充特征矩阵:
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 循环,那就更好了。这可能吗?
使用 NullaryExpr
你可以在 Eigen 中使用零(手动)循环来做到这一点:
Eigen::MatrixXd A = Eigen::MatrixXd::NullaryExpr(M, N,
[](Eigen::Index i, Eigen::Index j) {return std::sin(i+j);});
经过优化编译后,这不一定比手动双循环版本快(不经过优化甚至可能更慢)。
您可以写 int
或 long
而不是 Eigen::Index
,如果那样更易读的话...