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

How to create an orthogonal matrix in Matlab with one fixed column

我想创建一个 NxN 方阵正交矩阵,约束条件是第一列是 k*ones(N,1) 的列向量,其中 k 是一个常数。有手续吗?

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

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

很抱歉我不能引用 MATLAB 代码,但我相信这将很容易编写代码。

你要的是Householder reflector 这些是对称的非正规矩阵(它们自己的逆矩阵也是)。 给定一个向量 v 你可以找到一个反射器 H 使得

H*v = a*e1

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

我想 MATLAB 有一个例程。

鉴于 H 的属性,这意味着 H 的第一列与 v 平行,其他列与 v 正交且彼此正交。

所以如果你适当地缩放 H 的第一列(它的长度为 1),你就有了你想要的矩阵。

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

或者:

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

给你一个方阵相互正交的列,不管向量是什么kk。仅当 norm(k)==1 时,它才会是 正交 矩阵(正如其他人所指出的,在您的示例中暗示 k=1/sqrt(3) )。请注意,第一种情况并不意味着它的行是正交的,而第二种情况确实如此。