4

编辑:

谢谢@yoda 和@morispaa。你是对的,@morispaa 的解决方案有效,即我对转换系数的处理,它基于对Z跨越的空间的假设,以及Z向量的顺序“方向”,如果我更新Q的列的符号,使得R的对角线具有正元素。

有关我正在进行的转换的更多详细信息,您可以阅读内容;下面的Z = 采样的 Zernike 多项式,众所周知,它在离散情况(我们的情况)上既不正交也不完整。

关于@morispaa 提出的解决方案为何有效的直觉。我很想听听您对此的意见:

我的直觉是,以某种方式在R中强制执行真正的非负对角线会呈现一个基Q ,它与Z中的向量更好地“对齐” (正如我之前所说,它是非单一的),因此下面的选项 1 和 2,即使它们代表不同的变换,输出系数也可能在相似的空间中。

更具体地说,我认为Z “几乎”是单一的,也许这会导致QR分解返回一个足够接近Z的基础?只有这样,我才能想象我对转换系数的处理(基于对Z中向量的具体情况的假设)在Q的对角线完全为正时起作用,但在它具有负条目时不起作用。你怎么看?

背景

我的机器上安装了 MATLAB R2011aR2010b

R2010bR2011a的更改之一会影响(请参阅此处qr()有关此特定更改的发行说明)的实施。

我的项目中的一个重要部分qr()用于估计直接和逆变换的正交基。我的代码将此转换应用于输入信号,处理转换后的系数并返回处理后的信号。换句话说,在R2011aqr()所做的更改使处理此变换的系数的块停止工作(逆变换不会返回已处理信号的预期逆变换)。

不知何故,现在返回的Qqr()矩阵与旧版本不同,这会阻止对变换系数的处理正常工作。

第一个问题

鉴于上述情况,是否可以告诉R2011aqr()R2010b使用?

第二个问题

我使用QQ'来计算直接和逆变换;您可以在此处查看更多详细信息。更具体地说,我使用y = Q * xx = 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使我的转换再次工作吗?

4

2 回答 2

2

QR分解中A=QRR是一个上三角矩阵。如果您的矩阵Ainvertible,那么如果您施加具有实数、非负对角线的条件,则分解是唯一的。R如果放宽这个条件,你会得到一个正交矩阵Q和一个上三角矩阵R,但它们不必是唯一的。

分解的非唯一性经常使人们感到困惑,我想我会指出我最喜欢的例子之一:单位矩阵的特征向量

从您提供的链接:

兼容性考虑: 由于 QR 分解不是唯一的,因此这些不同的结果仍然是正确的。确保您的代码不依赖于因子 Q 和 R 的元素值。

这是您的代码发生的情况吗?它取决于Qand的形式R吗?

作为一个快速修复,你可以试试这个R2010b

which qr.m

在我的机器上,我得到/Applications/MATLAB_R2010b.app/toolbox/matlab/matfun/qr.m. 您可以尝试复制此功能并将其放在您的R2011路径中,然后将其重命名为qr2010或其他名称吗?然后,当您需要旧函数时,您可以qr2010从最新版本的 MATLAB 调用,它应该使用旧算法。我还没有测试过,所以让我知道它是否有效。

编辑

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
于 2011-05-03T07:11:29.603 回答
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;
于 2011-05-03T09:38:00.847 回答