犰狳相当于 A(find(A<0)) = 0
Armadillo equivalent to A(find(A<0)) = 0
虽然我的问题与之前发布的问题类似:
它略有不同,因此似乎不起作用。我正在求解 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() 函数到 运行 的时间可能比 post 处理时间长得多。
虽然我的问题与之前发布的问题类似:
它略有不同,因此似乎不起作用。我正在求解 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() 函数到 运行 的时间可能比 post 处理时间长得多。