c++ - Armadillo 相当于 A(find(A<0)) = 0

标签 c++ c++11 armadillo

尽管我的问题与之前发布的问题类似:Armadillo equivalent for MATLAB operations

它略有不同,所以它似乎不起作用。我正在求解 PDE 并使用解 vector soln(Nr,Nt) 遍历时间,其中 Nr 是空间网格大小,Nt 是时间步数。我正在使用以下调用

soln.col(n+1) = solve(A,B*soln.col(n));

引入了数值误差,我们得到了很小但不可忽略的人为负数。我不想每次都使用 find(soln < 0),因为矩阵是 Nr*Nt。我宁愿只看那个特定的列,但是语法 find(soln.col(n+1))<0)不能用于调整列元素。当然,我可以在每次迭代中只使用一个 for 循环并按元素进行检查,但我认为这似乎会更慢(如果我错了请纠正我)。

感谢任何帮助。

最佳答案

.clean()函数在这里可能适合您,适用于 Armadillo 9.600 或更高版本。

soln.col(n+1).clean(datum::eps);

清理整个矩阵:

soln.clean(datum::eps);

.clean() 会将所有绝对值 <= datum::eps 的元素归零.

如果您想将所有负数清零,请使用 .transform()函数是一种可能性(需要支持 C++11 的编译器):

vec tmp = solve(A,B*soln.col(n));

tmp.transform( [](double val) { return (val < 0.0) ? 0.0 : val; } );

soln.col(n+1) = tmp;

直接处理每一列也可能有效(尚未测试):

soln.col(n+1).transform( [](double val) { return (val < 0.0) ? 0.0 : val; } );

solve()无论如何,函数的运行时间可能比后处理要长得多。

关于c++ - Armadillo 相当于 A(find(A<0)) = 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59314795/

相关文章:

c++ - std::is_base_of 用于模板类

python - 如何将 numpy 数组发送到 Armadillo (C++) 并从 Armadillo 返回一个 numpy 数组

c++ - MATLAB 运算的 Armadillo 等效项

c++ - 从匿名指针类型中检索内部类型

c++ - 遇到段错误,在类和变量方面遇到问题

c++ - 如何在不使用原子的情况下同步 CUDA 中的线程

c++ - 对指针列表进行排序 C++ - 没有匹配的函数错误

c++ - 并发写入 vector<bool>

armadillo - 在 Armadillo C++ 中返回稀疏矩阵的位置和值

java - 痛饮 :how to deal with pointers in generated Java code