MATLAB:运行以前版本的函数

时间:2011-05-02 18:29:43

标签: matlab least-squares factorization

编辑:

谢谢@yoda和@morispaa。你是对的,@ morispaa的解决方案是有效的,即我对变换系数的处理,这是基于对 Z 跨越的空间的假设,以及顺序 Z 向量的“方向”,如果我更新 Q 列的符号,则呈现正确的结果,以便 R的对角线有积极因素。

有关我正在进行的转型的更多详情,请阅读this;下面的 Z =采样的Zernike多项式,已知在离散情况下是正交的,也不是完整的(我们的情况)。

关于为什么@morispaa提出的解决方案有效的直觉。我很想听听你的意见:

我的直觉是,在 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 重新启动转换?

2 个答案:

答案 0 :(得分:2)

在{strong> QR 因子分解为A=QR时,R是一个上三角矩阵。如果您的矩阵A 可逆,那么如果您强加R具有真实的非负对角线的条件,则因子分解唯一。如果放宽此条件,则会得到正交矩阵Q和上三角矩阵R,但它们不一定是唯一的。

分解的非唯一性经常让人感到困惑,我想我会指出你最喜欢的一个例子:the eigenvectors of an identity matrix

从您提供的链接:

  

兼容性注意事项:    自从   QR分解并不是唯一的,这些   不同的结果仍然是正确的。   确保您的代码不依赖   关于元素的价值   因素Q和R.

这是你的代码发生了什么?它取决于QR的形式吗?

作为快速解决方法,您可以尝试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

我在R2011aR2010b都得到了相同的结果。所以,我的猜测是某种程度上你依赖于对角线是积极的,这可能不是一件好事。

但是如果你想保留你的代码,而是让新的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;