等于A(find(A <0))= 0的Armadillo

问题描述 投票:0回答:1

尽管我的问题与此处发布的先前问题类似: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循环并逐个元素地进行检查,但是这似乎会比较慢(如果我做错了,请纠正我)。

感谢您的任何帮助。

c++ c++11 armadillo
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.