如何将值分类(通过复平面中的象限)?

Posted

技术标签:

【中文标题】如何将值分类(通过复平面中的象限)?【英文标题】:How to classify values into groups (by their quadrants in the complex plane)? 【发布时间】:2014-02-03 19:54:44 【问题描述】:

嗨,我有一个 4x4 双矩阵

 1+2i   2-1i  -3-2i  -1+4i

 3-1i  -3+2i   1-3i  -1-3i   

 4+3i   3+5i   1-2i  -1-4i  

 4+2i  -5-2i   2+3i   2-1i 

如何在 MATLAB 的 1+1i、1-1i、-1+1i、-1-1i 类别中将它们分成不同的组?

例如1+1i 组:1+2i、4+3i、3+5i、4+2i、2+3i 1-1i 组:2-1i、3-1i、1-3i、1-2i、2-1i -1+1i 组:-1+4i、-3+2i -1-1i 组:-3-2i、-1-3i、-1-4i、-5-2i

【问题讨论】:

【参考方案1】:

怎么样:

% example matrix
Z = [ 1+2i   2-1i  -3-2i  -1+4i ;
      3-1i  -3+2i   1-3i  -1-3i ; 
      4+3i   3+5i   1-2i  -1-4i ; 
      4+2i  -5-2i   2+3i   2-1i ]

蛮力方法,如果你不关心组的顺序:

classification = ceil( angle(Z)*4/(2*pi) ) + 2

quadrant1 = Z(classification == 3)
quadrant2 = Z(classification == 4)
quadrant3 = Z(classification == 1)
quadrant4 = Z(classification == 2)

根据需要更改顺序。你当然也可以使用下面的循环/cellfun。


或自动订购:

请注意,我根据高斯复平面选择了一个有意义的顺序,因为您提出的顺序在数学/物理方面没有意义。

classification = ceil( angle(Z)*4/(2*pi) );
classification(classification < 1) = classification(classification < 1) + 4;
for ii = 1:4;
    quadrantii,: = Z(classification == ii);
end

或将循环替换为:

quadrant = cellfun(@(x) Z(classification == x), num2cell(1:4),'Uni',0)'

返回一个包含 4 个单元格的单元格数组,每个象限按照正确的顺序一个包含所有相应的复数:

>> quadrant:

ans =

   1.0000 + 2.0000i
   4.0000 + 3.0000i
   4.0000 + 2.0000i
   3.0000 + 5.0000i
   2.0000 + 3.0000i


ans =

  -3.0000 + 2.0000i
  -1.0000 + 4.0000i


ans =

  -5.0000 - 2.0000i
  -3.0000 - 2.0000i
  -1.0000 - 3.0000i
  -1.0000 - 4.0000i


ans =

   3.0000 - 1.0000i
   2.0000 - 1.0000i
   1.0000 - 3.0000i
   1.0000 - 2.0000i
   2.0000 - 1.0000i

Don't punch me Rody - 但我宁愿这样写:

Im = imag(Z) >= 0;
Re = real(Z) >= 0;

quadrant = 
    Z(  Re &  Im)
    Z( ~Re &  Im)
    Z( ~Re & ~Im)
    Z(  Re & ~Im)
;

...因为我打算避免所有这 8 种逻辑比较。真的更快吗?

【讨论】:

好吧,angle 包含一个 atan,并且不是内置的。将cellfun 与匿名函数一起使用可能会很慢。你是对的,你的实现应该更快 :) 但我的符号更接近于你在数学环境中编写东西的方式,通过自我文档提高可读性,但这样做的好处可以争论,因为它们更像是口味问题。 @RodyOldenhuis 没错,您的符号可以从带有一些大括号的数学公式中复制。 :p 事情是你做了 8 次,我的蛮力方法(类似于你的)只是做了 4 次,并且没有额外的 &amp; 操作。我不知道运营商&lt;,&gt;,==,&amp; 在性能方面是否有任何差异,但您似乎有更多的关系操作。无论如何 +1 为您的解决方案,这真的只是一个品味问题 ;)【参考方案2】:

最快最直观的恕我直言:

Im = imag(Z);
Re = real(Z);

quadrant = 
    Z(Im >  0 & Re >  0)
    Z(Im >  0 & Re <= 0)
    Z(Im <= 0 & Re >  0)
    Z(Im <= 0 & Re <= 0)
;

【讨论】:

以上是关于如何将值分类(通过复平面中的象限)?的主要内容,如果未能解决你的问题,请参考以下文章

编程 输入一平面坐标点(x,y),判断并输出该坐标点位于哪个象限?c语言

四叉树平面分割算法--快速图元搜索

两个平行的坐标系点的坐标有啥规律

单击复选标记,访问,VBA代码时将值解析为变量

平面坐标系中 如何判断某一点在一矩形区域内?

如何通过 switch compact 将值 1 插入 sq-lite 中的列