Как создать ортогональную матрицу в Matlab с одним фиксированным столбцом - PullRequest
0 голосов
/ 31 января 2019

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

Т.е.

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

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

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Может быть, это должно быть опубликовано на 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
0 голосов
/ 31 января 2019

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

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

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

.
0 голосов
/ 31 января 2019

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

То, что вы хотите, это Отражатель домохозяина Это отонормальные матрицыкоторые симметричны (как и их собственные инверсии).Учитывая вектор v, вы можете найти отражатель H так, чтобы

H*v = a*e1

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

.представьте себе, что в MATLAB есть подпрограмма для этого.

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

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

...