如何在Matlab中使用一个固定列创建正交矩阵

时间:2019-01-31 10:10:01

标签: matlab matrix orthogonal

我想创建一个正交的NxN正方形矩阵,约束条件是第一列是k * ones(N,1)的列向量,其中k是选择时的常数。有什么程序吗?

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

是一个3x3矩阵,其中第一列是向量k * ones(3,1),而另两个向量必须以矩阵正交的方式创建

3 个答案:

答案 0 :(得分:2)

也许这应该发布在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

答案 1 :(得分:2)

或者:

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

为您提供具有相互正交的列的方阵,无论向量kk是什么。仅当norm(k)==1时(它在您的示例中暗示k=1/sqrt(3),正如其他人所指出的那样),它才是正交矩阵。请注意,第一种情况并不意味着其行是正交的,而第二种情况则是这样。

答案 2 :(得分:1)

对不起,我不能引用MATLAB代码,但是我敢肯定这将很容易编写代码。

您想要的是Householder reflector 这些是对称的反正态矩阵(它们的逆也是如此)。 给定向量v,您可以找到反射器H,从而

H*v = a*e1

其中a是+ = v的长度,e1是(1,0,..)'

我想MATLAB对此有一个例程。

鉴于H的性质,这意味着H的第一列与v平行,而其他列与v相互正交。

因此,如果适当地缩放H的第一列(长度为1),就可以得到所需的矩阵。