2

如果之前有人问过类似的问题,我很抱歉。我有两个50 xn的向量,并且想要找到第一个向量的偏移,它提供与第二个向量最接近的匹配。我已经尝试过fminsearchcircshift但是在 Matlab 中,无法完全找到在这种情况下如何使用它们。

我也看到了这里的讨论,但是,我不需要有代表性的函数或插值来匹配这两个向量。相反,我只想要一个配置文件的最佳转换,从而最大限度地减少沿配置文件的差异。如果你能指导我,我会很高兴。另外,我可以fminsearch用来解决这个问题吗?

4

2 回答 2

3

您可以使用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会找到最佳解决方案,除非您的数据遵循清晰的模式,或者您无论如何都要分析所有变化,但它也会很慢。

于 2015-09-13T17:54:23.053 回答
0

这不只是OLS吗?澄清一下,我假设第二个矩阵是 Y,第一个矩阵是 X,两者都有50 x n一些预先指定的值的维度n。为简单起见,堆叠矩阵,使得XY(50 x n) x 150xn行和1列。那么你的模型是

Y_i = a + bX_i + e_i.

您的目标是最小化平方误差的总和:

min_{a,b} sum_i e_i^2. 

您可以使用 fmincon 或求解解析解。请参阅简单的线性回归公式:

https://en.wikipedia.org/wiki/Simple_linear_regression

于 2015-09-13T16:19:45.337 回答