将数组的虚部或实部舍入到不同的公差

Round imaginary or real parts of an array to different tolerances

我在 Matlab 中有一个复杂的数组

x = [2+1i, 0.1+3i, 0.001+4i, 5+0.0002i, 6+0.0013i]

如果实部或虚部小于某个公差,我想让它们等于零。

例如,如果实数容差为0.01,虚数容差为0.001,那么运算后我的数组应该是这样的:

x = [2+1i, 0.1+3i, 0+4i, 5+0i, 6+0.0013i]

当然我可以将 x 拆分为实部和虚部,分别将它们四舍五入,然后将它们合并回去。但是,实际的数组每个都很大(100k*100k),我不想浪费内存。

有没有一种方法可以在不将复杂数组一分为二的情况下将其四舍五入?

首先,让我们定义您的公差

tolReal = 0.01;
tolImag = 0.001;

您可以创建一个函数

f = @(z) real(z).*(real(z)>tolReal) + 1i.*imag(z).*(imag(z)>tolImag);

我们可以在您的示例数组上测试它是否有效:

>> x=[2+1i 0.1+3i 0+4i 5+0i 6+0.0013i]
>> y = f(x)
y = 
   2 + 1i   0.1 + 3i   0 + 4i   5 + 0i   6 + 0.0013i  

使用这种函数形式的好处是我们可以使用arrayfun并避免创建100k*100k的逻辑矩阵

y = arrayfun( f, x );

这将产生相同的结果,但内存占用更少。 对于大型矩阵(如您的情况),这可能比 logical/vectorized 方法更快,因为我们避免创建大型矩阵。对于小矩阵,您可能会发现它比较慢,因为它基本上是一个伪装的循环。