как убрать комплексное число в векторе в Matlab - PullRequest
5 голосов
/ 01 марта 2011

Предположим, в Matlab есть вектор, элементы которого могут быть сложными или действительными.Мне было интересно, как убрать нереальные элементы и, следовательно, уменьшить размер вектора?Спасибо и всего наилучшего!

Ответы [ 3 ]

12 голосов
/ 01 марта 2011

Используйте функции REAL и IMAG :

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

EDIT

Выше не отвечает на вопрос автора. Это делает.

Используйте функции FIND и REAL :

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

v =

                          1 +                     1i
                          2                         
                          3                         

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

ans =

     2
     3
4 голосов
/ 01 марта 2011

Вы также можете избежать тестирования в цикле, используя векторный синтаксис 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.

1 голос
/ 01 марта 2011

Это очень необычная вещь, которую нужно спросить.Поскольку мнимая часть является числом с плавающей запятой, вы не можете точно сказать, какое число является действительным числом, а какое очень близко к действительному числу.Такой функции не существует в 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

Конечно, если вы скажете нам, каков ваш настоящий критерий, было бы гораздо легче дать вам лучшее представление.Вы ищете реальные решения для какого-то уравнения или системы уравнений, реальные корни многочлена?В этом случае первый может упустить реальное решение из-за ошибки аппроксимации, а второй может дать вам то, что не является решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...