如何在 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)
)。请注意,第一种情况并不意味着它的行是正交的,而第二种情况确实如此。
我想创建一个 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)
)。请注意,第一种情况并不意味着它的行是正交的,而第二种情况确实如此。