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

5

在Matlab中,假设有一个向量,其元素可以是复数或实数。我想知道如何删除非实元素,并因此减小向量的大小?谢谢!


3个回答

13

使用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

谢谢!但我想把那些非实数从向量中取出,而不是用它们的实部替换它们。 - Tim
谢谢!但还不是我想要的。例如,v=[1+i, 2, 3],我希望v变成[2,3],而不是[1,2,3]或[1,0,0]。 - Tim
1
@Tim:好的,现在我明白你想要什么了。请查看我上面编辑过的答案。 - b3.

5

您还可以使用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 会产生一个逻辑向量,当等式成立时会有 true 值。 x(<logical vector>) 会返回一个新的向量,其中只包含 <logical vector> 中为 true 的元素。


2
这是一个非常不寻常的请求。由于虚部是浮点数,你无法确定哪个数字是实数,哪个数字非常接近实数。由于不清楚如何在任何方面有用(删除这些数字并没有多大意义),所以 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

当然,如果您告诉我们您实际的标准,那么我们就可以更轻松地为您提供更好的建议。您是在寻找某种方程或方程组的真正解法,还是多项式的实根?在这种情况下,第一种方法可能会因近似误差而错过实际解,而第二种方法可能会给您一些不是解的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接