相当于 A(find(A<0)) = 0 的犰狳

Posted

技术标签:

【中文标题】相当于 A(find(A<0)) = 0 的犰狳【英文标题】:Armadillo equivalent to A(find(A<0)) = 0 【发布时间】:2019-12-13 01:04:42 【问题描述】:

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

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

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

引入了数值误差,我们得到了小但不可忽略的人为负数。我不想每次都使用 find(soln find(soln.col(n+1))<0) 不能用于调整该列元素。当然,我可以在每次迭代时只使用一个 for 循环并逐个检查元素,但我这似乎会更慢(如果我错了,请纠正我)。

感谢任何帮助。

【问题讨论】:

【参考方案1】:

.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() 函数的运行时间可能比后处理要长得多。

【讨论】:

谢谢!两种方法都有效。有趣的是(或不是?)它们似乎与遍历整个列并将负数设置为 0 的速度大致相同。

以上是关于相当于 A(find(A<0)) = 0 的犰狳的主要内容,如果未能解决你的问题,请参考以下文章

POJ2356 Find a multiple

c++ string类find总结

162. Find Peak Element

153. Find Minimum in Rotated Sorted Array

Implement Find and replace (find given pattern and replace it with a given string)

MATLAB 怎样求矩阵非零元的坐标