我想创建一个正交的NxN正方形矩阵,约束条件是第一列是k * ones(N,1)的列向量,其中k是选择时的常数。有什么程序吗?
即
A= [k * *;k * *;k * *]
是一个3x3矩阵,其中第一列是向量k * ones(3,1),而另两个向量必须以矩阵正交的方式创建
答案 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),就可以得到所需的矩阵。