【问题标题】:Round imaginary or real parts of an array to different tolerances将数组的虚部或实部舍入到不同的公差
【发布时间】:2018-02-22 04:12:35
【问题描述】:

我在 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)每个我不想浪费内存这样做。

有没有办法将复杂数组的各个部分舍入而不将其分成两部分?

【问题讨论】:

  • 简单的方法是将所有数字四舍五入到某个精度:(您可以使用round或floor或以相同方式修复),“ y=round(x./accuracy).*accuracy”跨度>
  • @MendiBarel 这根本没有真正解决这个问题,这是关于分别舍入实部和虚部......

标签: matlab vectorization complex-numbers


【解决方案1】:

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

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 );

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

【讨论】:

  • 哦,谢谢,是的,我已经用我的实际矩阵进行了测试,并且工作正常,不会过度消耗我的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
相关资源
最近更新 更多