在Matlab中,假设有一个向量,其元素可以是复杂的或真实的。我想知道如何删除非真实元素,从而减少向量的大小?谢谢和问候!
答案 0 :(得分:12)
>> 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
修改强>
上述内容并未回答海报的问题。这样做。
>> 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
向量,其值为true
。 x(<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
当然,如果你告诉我们你的实际标准是什么,那么给你一个更好的主意会容易得多。您是在寻找某种方程式或方程组的真实解,多项式的实根?在这种情况下,由于近似误差,第一个可能会错过一个真正的解决方案,而第二个可能会给你一些不是解决方案的东西。