- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
编辑:
谢谢你@yoda和@morispa你是对的,@morispa的解是对的,也就是说,我对转换系数的处理,基于关于Z所跨越的空间的假设,以及Z向量的顺序和“方向”,如果我更新Q列的符号,使R的对角线具有正元素,就会得到正确的结果。
有关我正在处理的变换的更多详细信息,您可以阅读this;Z below=sampled Zernike多项式,这些多项式在离散情况(我们的情况)中既不是正交的也不是完全的。
关于@morispa提出的解决方案为什么有效的直觉我很想听听你的意见:
我的直觉是,以某种方式强制R中的实非负对角线使得基Q与Z中的向量更好地“对齐”(正如我前面所说,Z是非酉的),因此下面的选项1和2,即使它们表示不同的变换,输出系数可能在相似的空间中。
更具体地说,我认为Z是“几乎”酉的,这可能会导致QR分解返回一个足够接近Z的基只有到那时,我才能想象,我对转换系数的处理,基于Z中向量的specifics的假设,在Q的对角线完全为正时工作,而不是在Q的对角线为负时工作你怎么认为?
背景
我的机器上同时安装了MATLAB R2011a和R2010b。
从R2010b到R2011a的其中一个更改会影响qr()
的实现(请参阅有关此特定更改here的发行说明)。
我的一个项目的一个重要部分是使用qr()
来估计正、反变换的正交基我的代码将此转换应用于输入信号,处理转换后的系数并返回处理后的信号换言之,在R2011a中所做的改变使得处理该变换的系数的块停止工作(逆变换不返回所处理信号的预期逆变换)。
不知何故,现在从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;
% 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
qr()
来进行直接和逆变换(这比为每个新向量计算最小二乘法快得多)如果我想在我的项目中使用新的
qr()
,有人知道如何使用新的Q使我的转换再次工作吗?
最佳答案
在QR分解中,A=QR
是一个上三角矩阵如果矩阵R
是可逆的,那么如果你施加A
有实的非负对角线的条件,那么因子分解是唯一的如果放松这个条件,就会得到一个正交矩阵R
和一个上三角矩阵Q
,但它们不必是唯一的。
分解的不唯一性常常会让人困惑,我想我会给你举一个我最喜欢的例子:the eigenvectors of an identity matrix。
从您提供的链接:
兼容性注意事项:
自从
QR分解不是唯一的,这些
不同的结果仍然是正确的。
确保您的代码不依赖于
关于元素的值
因子Q和R。
这就是你的代码吗是否取决于R
和Q
的形式?
作为一个快速的解决方案,您可以从R
中尝试一下吗:R2010b
在我的机器上,我得到which qr.m
你能试着复制这个函数并把它放在/Applications/MATLAB_R2010b.app/toolbox/matlab/matfun/qr.m
路径中,然后把它重命名为R2011
或其他什么吗然后,只要需要旧函数,就可以从最新版本的MATLAB调用qr2010
,它应该使用旧算法我还没有测试过,所以告诉我是否有效。
编辑
我在我的机器上安装了qr2010
,并签出了R2011a
如我所说,不强制使用正对角线将导致元素符号的不同组合,从而使解决方案不唯一但是,正向和反向转换应该是有效的,在我的机器上也是如此。
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
qr
和
R2011a
中都得到了相同的结果所以,我的猜测是你在某种程度上依赖于对角线是正的,这可能不是一件好事。
R2010b
返回与
qr
中相同的矩阵,那么你应该使用morispa的建议。
R2010b
中,
2010b
的对角线是正的,所以要在
R
中得到相同的行为,只需要得到对角线的符号并在
2011a
矩阵中传播它在上面的例子中,
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
R
是
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
D
的对角线会自动变为正(非常简单)类似地,在
R
矩阵中传播符号请注意,
-1*-1=1
只是对角矩阵元素的平方,等于恒等矩阵因此,我们得到
Q2*R2=Q*D*D*R
=Q*I*R
=Q*R
=A
关于matlab - MATLAB:从先前版本运行功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5860902/
我的应用将 SceneKit 内容的“页面”与图像和文本交替。当我从图像页面前进到新的 SceneKit 页面时,前一个 SceneKit 页面中的内容会短暂显示,然后被新内容替换。时髦。 我只使用一
我正在尝试处理(在 C# 中)包含一些数字数据的大型数据文件。给定一个整数数组,如何对其进行拆分/分组,以便如果下一个 n(两个或更多)是负数,则前一个 n 元素被分组。例如,在下面的数组中,应该使用
刚接触promises,研究过。所以我的代码和我的理解: sql.connect(config).then(function(connection) { return connection.req
目前我在 if (roobaf) block 中有一些代码,这取决于 foo 和 bar 是否为假。我可以在 block 内再次检查这些条件,但感觉像是不必要的代码重复。 if (foo) {
我是一名优秀的程序员,十分优秀!