我在Matlab中有一个复杂的数组
x = [2+1i, 0.1+3i, 0.001+4i, 5+0.0002i, 6+0.0013i]
我想让实部或虚部等于零,如果它们小于某种容限。
例如,如果实际容忍度为0.001,而虚容为0.001,那么在操作之后,我的数组应该如下所示:
x = [2+1i, 0.1+3i, 0+4i, 5+0i, 6+0.0013i]
当然,我可以把x分割成它的实部和虚部,独立地把它们围起来,然后再加入它们。但是,实际的数组相当大(100 k*100 k)--我不想浪费内存。
有没有一种方法可以绕过复杂数组的各个部分而不将其分割成两部分呢?
发布于 2018-02-22 02:49:13
首先,让我们来定义一下您的公差
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
并避免创建100 k*100 k逻辑矩阵。
y = arrayfun( f, x );
这将产生同样的结果,但内存占用更少。这可能比大型矩阵的逻辑/矢量化方法更快(就像在您的例子中那样),因为我们正在避免创建大型矩阵。对于小矩阵,您可能会发现它比较慢,因为它基本上是一个伪装的循环。
https://stackoverflow.com/questions/48919553
复制