2016-05-19 3 views
1

Аналогичная проблема с этим вопросом matrix that forms an orthogonal basis with a given vector, но у меня возникают проблемы с моей реализацией. У меня есть вектор, u, и я хочу построить произвольную ортонормированную матрицу V такую, что V(:,1) = u/norm(u). Проблема, которую я получаю, заключается в том, что V'*V не I (но диагональ). Вот мой код:Проблема создания ортонормальной матрицы с заданным вектором в matlab

function V = rand_orth(u) 
    n = length(u); 
    V = [u/norm(u) rand(n,n-1)]; 

    for i = 1:n 
     vi = V(:,i); 
     rii = norm(vi); 
     qi = vi/rii; 
     for j = i+1:n 
      rij = dot(qi,V(:,j)); 
      V(:,j) = V(:,j) - rij*qi; 
     end 
    end 
end 

ответ

1

Просто нормализует столбцы V, как только вы закончили ортогонализацию. Обратите внимание, что также нет необходимости нормализовать u (первый столбец) изначально, так как мы будем нормализовать всю матрицу в конце:

function V = rand_orth(u) 
    n = length(u); 
    V = [u, rand(n,n-1)]; 

    for i = 1:n 
     vi = V(:,i); 
     rii = norm(vi); 
     qi = vi/rii; 
     for j = i+1:n 
      rij = dot(qi,V(:,j)); 
      V(:,j) = V(:,j) - rij*qi; 
     end 
    end 

    V = bsxfun(@rdivide, V, sqrt(diag(V'*V))'); 
end 
Смежные вопросы