2011-04-19 1 views
3

Если мне задан набор векторов (они могут быть представлены как векторы столбцов матрицы), и я хочу получить максимально независимые векторы, что это лучший способ сделать это?Как получить максимально независимые векторы, заданные набором векторов в MATLAB?

Я мог бы добавить один вектор к результирующему набору за раз, чтобы узнать, увеличен ли ранг вновь сформированной матрицы или нет. Но я чувствую, что это не очень эффективно. Конечно, я мог бы вернуться к уничтожению Гаусса, чтобы справиться с этим. Но мне просто интересно, есть ли лучший (эффективный и численно стабильный и безопасный) подход к этой проблеме.

Спасибо.

Редактировать

Почувствуйте сложение, наблюдая ранг растет, вероятно, не является действительным. Мы можем делать удаление, наблюдая, если ранг уменьшается, хотя.

+0

Что именно вы подразумеваете под * максимально независимым *? – Phonon

+0

@Phonon: Я имел в виду любой набор независимых векторов, добавив еще одно из остальных, создало бы зависимый набор. –

ответ

1

Ведение RREF и ищем столбцы с ведущими нулями является лучшим выбором:

matr(:,logical(sum(rref(matr)==1))) 

Это даст вам основу для столбца пространства матрицы.

+0

это использование Гаусса-Иордана с частичным поворотом. Это один из методов, упомянутых выше. Было бы это не так стабильно численно? –

+0

Я не знал, что он не численно устойчив. В ближайшее время удалит ответ. – Phonon

2

Этот код будет делать трюк. Это немного грязно, потому что он растет rInd «на лету», который не самый эффективный, но идея важнее. Он использует QR-декомпозицию, которая в основном является ортогонализацией Грэма-Шмидта. Из этого он проходит через строки r, пока не найдет следующий вектор в A, который добавит что-то линейно независимое к известному в настоящее время принципу.

iUnderConsideration = 1; 

[q,r] = qr(A); 
rInd = []; 
for j = 1:size(r,2), 
    if(r(iUnderConsideration,j) ~= 0) 
     rInd = [rInd r(:,j)]; 
     iUnderConsideration = iUnderConsideration + 1; 
    end 
    if(iUnderConsideration > size(r,1)) 
     break; 
    end 
end 

q*rInd %here's your answer 

В качестве примечания, этот код будет выбрать векторы вашей матрицы A, не меняя их. svd не дал бы вам это прямо.

+0

Обратите внимание, что это предполагает, что ваши векторы являются векторами столбцов A. –

+0

@ Ben-Uri. Это было частью предположений OP. –

2
[U,S,V]=svd(vectors); 
U(1:size(vectors,1),1:size(vectors,2))=vectors; 

U теперь содержит исходные векторы плюс оптимально ортогональный набор.

Смежные вопросы