谢谢@yoda和@morispaa。你是对的,@ morispaa的解决方案是有效的,即我对变换系数的处理,这是基于对 Z 跨越的空间的假设,以及顺序和 Z 向量的“方向”,如果我更新 Q 列的符号,则呈现正确的结果,以便 R的对角线有积极因素。
有关我正在进行的转型的更多详情,请阅读this;下面的 Z =采样的Zernike多项式,已知不在离散情况下是正交的,也不是完整的(我们的情况)。
我的直觉是,在 R 中以某种方式强制执行真正的非负对角线会使 Q 基础对齐“更好地使用 Z 中的向量(正如我之前所说的那样,是非单一的),因此下面的选项1和2,即使它们代表不同的变换,输出系数可能在类似的空间。
更具体地说,我认为 Z “几乎”是单一的,也许这导致 QR 分解返回足够接近 Z <的基础/ STRONG>?只有这样我才能想象我对变换系数的处理是基于对 Z 中矢量的specifics的假设,当 Q 是完全正面的,但是当它有负面条目时则不是。你觉得怎么样?
我的机器上安装了MATLAB R2011a 和 R2010b 。
从 R2010b 到 R2011a 的更改之一会影响qr()
的实施(请参阅有关此特定更改的发布说明here)。
我的项目的一个重要部分是使用qr()
来估计直接和逆变换的正交基。我的代码将此变换应用于输入信号,处理变换后的系数并返回处理后的信号。换句话说,在 R2011a 到qr()
中所做的更改使处理此转换系数的块停止工作(逆转换不会返回已处理信号的预期逆转换) )。
以某种方式,现在从qr()
返回的 Q 矩阵与旧版本不同,其方式是阻止变换后的系数处理正常工作。
鉴于上述情况,是否可以告诉 R2011a 使用 R2010b 中的qr()
?
我使用 Q 和 Q'来计算直接和反向变换;你可以看到更多细节here。更具体地说,我使用 y = Q * x 和 x = Q'* y 分别计算直接和反向变换。计算直接变换的另一种方法是使用最小二乘法。换句话说,我们有两个选择:
选项1:使用QR分解进行直接和反向变换:
% Direct:
[Q R] = qr(Z);
y = Q' * x;
% Some processing of the y coefficients
% ...
% Inverse:
x = Q*y;
选项2:通过最小二乘拟合进行直接和反向变换
% Direct:
y = Z \ x;
% Some processing of the y coefficients
% ...
% Inverse:
x = Z*y;
我们的变量是:
% x = Input vector
% y = Direct transformation of x
% Z = Matrix with sampled basis
在 R2011a 中上方的选项1停止工作(适用于 R2010b )。我非常喜欢使用qr()
进行直接和反向变换的想法(它比为每个新向量计算最小二乘要快得多)。如果我想在我的项目中使用新的qr()
,是否有人知道如何使用新的 Q 重新启动转换?
答案 0 :(得分:2)
在{strong> QR 因子分解为A=QR
时,R
是一个上三角矩阵。如果您的矩阵A
可逆,那么如果您强加R
具有真实的非负对角线的条件,则因子分解唯一。如果放宽此条件,则会得到正交矩阵Q
和上三角矩阵R
,但它们不一定是唯一的。
分解的非唯一性经常让人感到困惑,我想我会指出你最喜欢的一个例子:the eigenvectors of an identity matrix。
从您提供的链接:
兼容性注意事项: 自从 QR分解并不是唯一的,这些 不同的结果仍然是正确的。 确保您的代码不依赖 关于元素的价值 因素Q和R.
这是你的代码发生了什么?它取决于Q
和R
的形式吗?
作为快速解决方法,您可以尝试R2010b
:
which qr.m
在我的机器上,我得到/Applications/MATLAB_R2010b.app/toolbox/matlab/matfun/qr.m
。您可以尝试复制此功能并将其放在R2011
路径中,并将其重命名为qr2010
或其他内容吗?然后,只要您需要旧函数,就可以从最新版本的MATLAB中调用qr2010
,它应该使用旧算法。我没有测试过这个,所以请告诉我它是否有用。
修改强>
我在我的计算机上安装了R2011a
并检出qr
。就像我说的那样,不执行正对角线将导致元素符号的不同组合,从而使解决方案不唯一。但是,正向和反向转换应该起作用,并且它在我的机器上也是如此。
A=magic(5);x=(1:5)'; %'
[Q R]=qr(A);
y=Q'*x; %'
z=Q*y;
z'
ans =
1.0000 2.0000 3.0000 4.0000 5.0000
我在R2011a
和R2010b
都得到了相同的结果。所以,我的猜测是某种程度上你依赖于对角线是积极的,这可能不是一件好事。
但是如果你想保留你的代码,而是让新的qr
返回与R2010b
中相同的矩阵,那么你应该使用morispaa的建议。
编辑2
morispaa解决方案的解释:由于在2010b
中,R
的对角线在2011a
中获得相同的行为是正面的,所以您需要做的就是获得对角线的符号并在整个R
矩阵中传播它。对于上面的示例,R
是
R =
-32.4808 -26.6311 -21.3973 -23.7063 -25.8615
0 19.8943 12.3234 1.9439 4.0856
0 0 -24.3985 -11.6316 -3.7415
0 0 0 -20.0982 -9.9739
0 0 0 0 -16.0005
和D
是
D =
-1 0 0 0 0
0 1 0 0 0
0 0 -1 0 0
0 0 0 -1 0
0 0 0 0 -1
R
的对角线自动变为正数(就像-1*-1=1
一样简单)。同样,您在Q
矩阵中传播符号。请注意,D*D
只是对角矩阵的元素的平方,并且等于I
,即单位矩阵。因此,我们得到
Q2*R2=Q*D*D*R
=Q*I*R
=Q*R
=A
答案 1 :(得分:2)
我认为(暂时没有MATLAB)您可以按如下方式恢复版本2010b的行为:
[Q R] = qr(Z);
D = diag(sign(diag(R)));
R2 = D*R;
Q2 = Q*D;
现在R2
将是上三角形,具有正对角线,Q2
保持正交(或单一)和Q2*R2 = Z
。在复杂的情况下使用
R2 = D'*R;
Q2 = Q*D;