gpt4 book ai didi

c++ - 使用现代 C++ 在 Eigen3 矩阵上使用 for 循环进行元素运算的优雅方式

转载 作者:行者123 更新时间:2023-11-28 04:34:09 25 4
gpt4 key购买 nike

我想根据每个元素的位置对矩阵中的元素进行一些操作。

我知道默认情况下, Eigen 矩阵是列优先的,因此要遍历矩阵,外部 for 循环针对每一列,内部 for 循环针对每一行。我有 4 种表达式分配给 m(r,c),具体取决于 rc 的值。部分伪代码如下所示:

if c == some_c
if r == some_r
m(r,c) = some expression A
else
m(r,c) = some expression B
else
if r == some_r
m(r,c) = some expression C
else
m(r,c) = some expression D

下面我也做了详细的c++代码。我不是 C++ 专家,所以我不确定我的代码是否优雅。你能告诉我如何改进它吗?我更愿意使用可能的现代 C++14 或 C++17 功能。

#include <Eigen/Dense>

using Matrix = Eigen::MatrixXd

void some_operation_on_matrix(Matrix& m, size_t some_r, size_t some_c)
{
for (size_t c = 0; c < m.cols(); c++) {
for (size_t r = 0; r < m.rows(); r++) {
if (c == some_c) {
if (r == some_r) {
// m(r,c) = some expression A
}
else {
// m(r,c) = some expression B
}
}
else {
if (r == some_r) {
// m(r,c) = some expression C
}
else {
// m(r,c) = some expression D
}
}
}
}
}

最佳答案

这是一个使用 lambda 仿函数的解决方案:

void some_operation_on_matrix(Eigen::MatrixXd& out, int some_r, int some_c)
{
out = Eigen::MatrixXd::NullaryExpr(out.rows(), out.cols(),
[&](Eigen::Index r, Eigen::Index c)
{
if(c == some_c)
if(r == some_r)
return 1.0; // some expr A
else
return 2.0; // some expr B
else
if(r == some_r)
return 3.0; // some expr C
else
return 4.0; // some expr D
});
}

可能更有效(如果所有表达式都是常量)

out.setConstant(D);
out.row(some_r).setConstant(C);
out.col(some_c).setConstant(B);
out(some_r, some_c) = A;

关于c++ - 使用现代 C++ 在 Eigen3 矩阵上使用 for 循环进行元素运算的优雅方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52003827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com