如果之前有人问过类似的问题,我很抱歉。我有两个50 xn的向量,并且想要找到第一个向量的偏移,它提供与第二个向量最接近的匹配。我已经尝试过fminsearch
,circshift
但是在 Matlab 中,无法完全找到在这种情况下如何使用它们。
我也看到了这里的讨论,但是,我不需要有代表性的函数或插值来匹配这两个向量。相反,我只想要一个配置文件的最佳转换,从而最大限度地减少沿配置文件的差异。如果你能指导我,我会很高兴。另外,我可以fminsearch
用来解决这个问题吗?
如果之前有人问过类似的问题,我很抱歉。我有两个50 xn的向量,并且想要找到第一个向量的偏移,它提供与第二个向量最接近的匹配。我已经尝试过fminsearch
,circshift
但是在 Matlab 中,无法完全找到在这种情况下如何使用它们。
我也看到了这里的讨论,但是,我不需要有代表性的函数或插值来匹配这两个向量。相反,我只想要一个配置文件的最佳转换,从而最大限度地减少沿配置文件的差异。如果你能指导我,我会很高兴。另外,我可以fminsearch
用来解决这个问题吗?
您可以使用gallery
的循环矩阵执行以下操作:
%// example data
A = randi([1,10],[1,10])
B = circshift(A,[0,3])
有了这些数据,匹配偏移预计为3
[~,minidx] = min(sum(abs(bsxfun(@minus,A,gallery('circul',B))),2))
shift = numel(A) - minidx + 1
shift =
3
%// circulant matrix
circul = gallery('circul',B)
%// substract vector A from all shifted rows of circulant matrix
diffs = bsxfun(@minus,A,circul)
%// sum absolute differences
C = sum(abs(diffs),2)
%// find index of row with minimum difference
[~,minidx] = min(C)
%// depending on your defintion of "shift", means
%// depending on where you start to count, you may want to
%// change this:
shift = numel(A) - minidx + 1
这是一种蛮力方法,虽然矢量化且高效。但它分析了向量 B 可能发生的所有可能的变化。如果你有很长的向量(数字 > 10000+),你可能会遇到 afminsearch
不会出现的内存问题。另一方面,您永远无法确定fminsearch
会找到最佳解决方案,除非您的数据遵循清晰的模式,或者您无论如何都要分析所有变化,但它也会很慢。
这不只是OLS吗?澄清一下,我假设第二个矩阵是 Y,第一个矩阵是 X,两者都有50 x n
一些预先指定的值的维度n
。为简单起见,堆叠矩阵,使得X
和Y
是(50 x n) x 1
(50xn
行和1
列。那么你的模型是
Y_i = a + bX_i + e_i.
您的目标是最小化平方误差的总和:
min_{a,b} sum_i e_i^2.
您可以使用 fmincon 或求解解析解。请参阅简单的线性回归公式: