Как создать ортогональную матрицу в Matlab с одним фиксированным столбцом

Я хочу создать квадратную матрицу NxN, ортогональную, с ограничением, что первый столбец представляет собой вектор-столбец из k * единиц (N, 1), где k - постоянная по выбору. Есть какая-то процедура?

I.e.

A= [k * *;k * *;k * *]

представляет собой матрицу 3x3, где первый столбец представляет собой вектор k*ones(3,1), а два других вектора должны быть созданы таким образом, чтобы матрица была ортогональной


person Albus    schedule 31.01.2019    source источник
comment
Не могли бы вы привести небольшой пример того, что вы имеете в виду (ввод и вывод)?   -  person Dev-iL    schedule 31.01.2019
comment
Я отредактировал вопрос: введите первый вектор-столбец, выведите результирующую ортогональную матрицу   -  person Albus    schedule 31.01.2019


Ответы (3)


Возможно, это следует разместить на Math.StackEchange, где уравнения могут быть правильно напечатаны, если вы хотите получить правильное теоретическое объяснение. Но если просто нужен код...

Во-первых, если N является размером вашей матрицы, это ограничивает значение k до:

k=sqrt(1/N);
A(1,:) = k*ones(1,N);

Затем можно построить вторую строку с помощью:

A(2,:) = sqrt(0.5)*[1,-1,zeros(1,N-2)];

Это создает простой вектор, ортогональный первому.

Третью строку можно вычислить с помощью:

aux = [1,1,-2,zeros(1,N-3)];
A(3,:) = aux/norm(aux);

Четвертый:

aux = [1,1,1,-3,zeros(1,N-4)];
A(4,:) = aux/norm(aux);

И так далее.

Вкратце:

A=zeros(N);
k=sqrt(1/N);
A(1,:) = k*ones(1,N);
for i=2:N
    aux = [ones(1,i-1),-(i-1),zeros(1,N-i)];
    A(i,:) = aux/norm(aux);
end
person Mefitico    schedule 31.01.2019
comment
Это верное решение. Спасибо! У этой процедуры есть название или она эмпирическая? - person Albus; 31.01.2019
comment
Я не знаю имени или ссылки на него. - person Mefitico; 31.01.2019

В качестве альтернативы:

kk = k*ones(3,1); % fixed first column (could be anything)
X = [kk, null(kk')']

дает вам квадратную матрицу с взаимно ортогональными столбцами, независимо от того, какой вектор kk. Это будет ортонормированная матрица только тогда, когда norm(k)==1 (что подразумевает k=1/sqrt(3) в ваших примерах, как отмечали другие). Обратите внимание, что первый случай не означает, что его строки ортогональны, а второй — делает.

person Florian    schedule 31.01.2019

К сожалению, я не могу цитировать код MATLAB, но я уверен, что это будет просто написать код.

Вам нужен отражатель Householder. инверсии). По заданному вектору v можно найти отражатель H так, чтобы

H*v = a*e1

где a равно += длине v, а e1 равно (1,0,..)'

Я полагаю, что в MATLAB есть процедура для этого.

Учитывая свойства H, это означает, что первый столбец H параллелен v, а остальные столбцы ортогональны v и друг другу.

Итак, если вы соответствующим образом масштабируете первый столбец H (он имеет длину 1), у вас есть желаемая матрица.

person dmuir    schedule 31.01.2019
comment
Спасибо. Я думаю, что это правильное решение проблемы! :) - person Albus; 31.01.2019