【发布时间】:2011-08-17 04:23:28
【问题描述】:
编辑:
谢谢@yoda 和@morispaa。你是对的,@morispaa 的解决方案有效,即我对变换系数的处理,这是基于对 Z 跨越的空间以及 order 和 的假设Z 向量的 >“orientation”,如果我更新 Q 列的符号以使 R 的对角线呈现正确的结果 有积极的元素。
有关我正在进行的转换的更多详细信息,您可以阅读this;下面的 Z = 采样的 Zernike 多项式,以 不 在离散情况(我们的情况)上不正交也不完整而著称。
对@morispaa 提出的解决方案为何有效的直觉。我很想听听您对此的意见:
我的直觉是,在 R 中以某种方式强制执行 真正的非负对角线 会呈现一个基础 Q,即“对齐" 更好地使用 Z 中的向量(正如我之前所说,它是非单一的),因此下面的选项 1 和 2,即使它们代表不同的变换,输出系数也可能在相似的空间。
更具体地说,我认为 Z “几乎”是单一的,也许这会导致 QR 分解返回一个足够接近 Z?只有这样我才能想象当 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 使我的转换再次起作用吗?
【问题讨论】:
-
“新”
qr()的输出有何不同?是彻底坏了吗?还是仅仅是可能归因于标准浮点问题的微小数值差异?是后者,如果您的整个应用程序出现故障,则可能表明您的算法在数值上不稳定。 (我很感激这不是对您的问题很有帮助的回答......) -
谢谢@Oli。我非常确信这不是数值稳定性问题,更多的是与新旧版本返回的 Q 矩阵之间的差异有关的问题(我认为
QR分解不是唯一的) .新的qr()可能是正确的,但是新的分解不满足旧分解的相同属性。我认为问题出在 R 矩阵的对角线的非负性,这是在以前版本中得到保证的属性,但在新版本中没有保证,并且在某种程度上影响了矩阵 Q也是。
标签: matlab least-squares factorization