尽管我的问题与此处发布的先前问题类似:Armadillo equivalent for MATLAB operations
它稍有不同,因此似乎不起作用。我正在求解PDE,并使用解矢量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()函数的运行时间可能比后处理要长得多。