Чтение нулевых значений в MatLab во время цикла

Я столкнулся с проблемой в MatLab при попытке запустить цикл. Для каждой итерации в цикле вычисляются собственные значения и собственные векторы для матрицы 3x3 (матрица различается на каждой итерации). Кроме того, каждая итерация всегда должна давать один собственный вектор вида [0 a 0], где только среднее значение a не равно нулю.

Мне нужно получить индекс столбца матрицы собственных векторов, где это происходит. Для этого я настроил следующий цикл в своем основном цикле (где генерируется матрица):

for i = 1:3
    if (eigenvectors(1,i)==0) && (eigenvectors(3,i)==0)
        index_sh = i
    end
end

Проблема в том, что рассматриваемая матрица собственных векторов иногда будет иметь вид:

eigenvectors =

   -0.7310   -0.6824         0
         0         0    1.0000
    0.6824   -0.7310         0

и в этом случае мой код работает хорошо, и я получаю index_sh = 3. Однако иногда матрица имеет вид:

eigenvectors =

    0.0000    0.6663    0.7457
   -1.0000    0.0000    0.0000
   -0.0000   -0.7457    0.6663

И в этом случае MatLab не присваивает никакого значения index_sh, хотя я хочу, чтобы index_sh было равно 1 в этом случае.

Если кто-нибудь знает, как мне решить эту проблему, чтобы MatLab присваивал значение также, когда нули записываются как 0.0000, я был бы очень благодарен!


person Kristian    schedule 25.03.2014    source источник
comment
Похоже на обычную проблему точности с плавающей запятой. Используйте допуск. См. stackoverflow.com/questions/686439/   -  person Luis Mendo    schedule 25.03.2014
comment
Спасибо. Вы знаете, как я могу обойти это как-то?   -  person Kristian    schedule 25.03.2014
comment
Попробуйте использовать собственные векторы (1, i) == 0,0. Скажи мне, если это работает. Другой вариант — использовать any(eigenvectors(1,i)) в качестве условия. Я также подозреваю, что в вашем случае элементы не равны нулю, поэтому я бы лучше использовал условие типа abs(eigenvectors(1,i))‹0,0000001 (очень небольшое число)   -  person freude    schedule 25.03.2014
comment
Большое спасибо, фрейд.   -  person Kristian    schedule 25.03.2014


Ответы (1)


Проблема, скорее всего, в том, что эти "0.0000" не совсем 0. Чтобы решить эту проблему, выберите допуск и используйте его при сравнении с 0:

tol = 1e-6;
index_sh = find(abs(eigenvectors(1,:))<tol & abs(eigenvectors(3,:))<tol);

В вашем коде:

for ii = 1:3
    if abs(eigenvectors(1,ii))<tol && abs(eigenvectors(3,ii))<tol
        index_sh = i
    end
end

Или вместо допуска вы можете выбрать столбец, чьи записи в первой и третьей строках ближе к 0:

[~, index_sh] = min(abs(eigenvectors(1,:)) + abs(eigenvectors(3,:)));
person Luis Mendo    schedule 25.03.2014
comment
@Kristian Добро пожаловать :-) См. редактирование, в котором не используется допуск. - person Luis Mendo; 25.03.2014
comment
Да, заметил :). Спасибо еще раз! - person Kristian; 25.03.2014