如何在Matlab中消除向量中的复数

时间:2011-03-01 01:04:42

标签: matlab

在Matlab中,假设有一个向量,其元素可以是复杂的或真实的。我想知道如何删除非真实元素,从而减少向量的大小?谢谢和问候!

3 个答案:

答案 0 :(得分:12)

使用REALIMAG功能:

>> x = [1+i; 4+3i; 5+6i]

x =

                          1 +                     1i
                          4 +                     3i
                          5 +                     6i

>> real(x)

ans =

     1
     4
     5

>> imag(x)

ans =

     1
     3
     6

修改

上述内容并未回答海报的问题。这样做。

使用FINDREAL功能:

>> v = [1+i; 2; 3]

v =

                          1 +                     1i
                          2                         
                          3                         

>> v(v == real(v))

ans =

     2
     3

答案 1 :(得分:4)

您还可以使用Matlab的矢量语法避免在循环中进行测试:

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0.000001i]
y = x(imag(x) == 0);
z = real(x(abs(imag(x)) < 0.00001));

y应为[1,2,6,7]z应为[1,2,6,7,9]

只要相等条件成立,

imag(x) == 0就会生成logical向量,其值为truex(<logical vector>)生成一个新的向量,其中只有x的元素<logical vector>true

答案 2 :(得分:1)

这是一个非常不寻常的问题。由于虚部是浮点数,因此无法确定哪个数是实数,哪个数非常接近实数。 Matlab中不存在这样的函数,因为它不是很清楚它对任何东西都有用(删除这些数字没有多大意义)。在这里指定您的实际目的可能有助于您获得更好的答案。

如果你想确保向量中只剩下实数,你可以使用下面的代码(它不适用于矩阵和垂直行,但你已经明白了):

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0i]
z = []
for k = [1:length(x)]
    if imag(x(k)) == 0
        z = [z, real(x(k))]
    endif
endfor

如果你想保留所有接近实数的数字,但可能有一些非零的虚数部分,你可以使用以下内容:

x = [1, 2, 3+1i, 4+2i, 5+3i, 6, 7, 8+4i, 9+0.000001i]
z = []
for k = [1:length(x)]
    if abs(imag(x(k))) < 0.00001
        z = [z, real(x(k))]
    endif
endfor

当然,如果你告诉我们你的实际标准是什么,那么给你一个更好的主意会容易得多。您是在寻找某种方程式或方程组的真实解,多项式的实根?在这种情况下,由于近似误差,第一个可能会错过一个真正的解决方案,而第二个可能会给你一些不是解决方案的东西。