我有一组三个向量(存储在3xN矩阵中),它们是“纠缠的”(例如,第二行中的某些值应该在第三行,反之亦然)。这种“纠缠”是基于查看绘制alpha2的图形。为了分离矢量,我使用基于差分的方法,其中我计算一个值与三个下一个值的差值(例如,比较(1,i)和(:,i + 1))。然后我采取最低限度并存储。该方法用于分离三个向量中的两个,但不是最后一个。
我想知道你们是否可以与我分享你的想法如何解决这个问题(如果可能的话)。我在下面添加了我的编码。
提前致谢!
数字中的问题:
clear all; close all; clc;
%%
alpha2 = [-23.32 -23.05 -22.24 -20.91 -19.06 -16.70 -13.83 -10.49 -6.70;
-0.46 -0.33 0.19 2.38 5.44 9.36 14.15 19.80 26.32;
-1.58 -1.13 0.06 0.70 1.61 2.78 4.23 5.99 8.09];
%%% Original
figure()
hold on
plot(alpha2(1,:))
plot(alpha2(2,:))
plot(alpha2(3,:))
%%% Store start values
store1(1,1) = alpha2(1,1);
store2(1,1) = alpha2(2,1);
store3(1,1) = alpha2(3,1);
for i=1:size(alpha2,2)-1
for j=1:size(alpha2,1)
Alpha1(j,i) = abs(store1(1,i)-alpha2(j,i+1));
Alpha2(j,i) = abs(store2(1,i)-alpha2(j,i+1));
Alpha3(j,i) = abs(store3(1,i)-alpha2(j,i+1));
[~, I] = min(Alpha1(:,i));
store1(1,i+1) = alpha2(I,i+1);
[~, I] = min(Alpha2(:,i));
store2(1,i+1) = alpha2(I,i+1);
[~, I] = min(Alpha3(:,i));
store3(1,i+1) = alpha2(I,i+1);
end
end
%%% Plot to see if separation worked
figure()
hold on
plot(store1)
plot(store2)
plot(store3)
答案 0 :(得分:1)
polyfit
:这个想法非常简单:迭代所有位置i
并使用polyfit
将度d
的多项式拟合到d+1
的{{1}}值到F(:,i-(d+1))
。使用这些多项式推断函数值F(:,i)
。然后计算最适合这些外推的实数值F(:,i+1)
的置换。如果涉及的功能很少,这应该可以很好地工作。肯定有一些改进空间,但对于您的简单设置,它应该足够了。
F(:,i+1)
这是一种类似的解决方案,试图最小化导数的总和,直到某个程度的向量值函数function F = untangle(F, maxExtrapolationDegree)
%// UNTANGLE(F) untangles the functions F(i,:) via extrapolation.
if nargin<2
maxExtrapolationDegree = 4;
end
extrapolate = @(f) polyval(polyfit(1:length(f),f,length(f)-1),length(f)+1);
extrapolateAll = @(F) cellfun(extrapolate, num2cell(F,2));
fitCriterion = @(X,Y) norm(X(:)-Y(:),1);
nFuncs = size(F,1);
nPoints = size(F,2);
swaps = perms(1:nFuncs);
errorOfFit = zeros(1,size(swaps,1));
for i = 1:nPoints-1
nextValues = extrapolateAll(F(:,max(1,i-(maxExtrapolationDegree+1)):i));
for j = 1:size(swaps,1)
errorOfFit(j) = fitCriterion(nextValues, F(swaps(j,:),i+1));
end
[~,j_bestSwap] = min(errorOfFit);
F(:,i+1) = F(swaps(j_bestSwap,:),i+1);
end
。它通过逐步调整位置F = @(j) alpha2(:,j)
并检查i
坐标的所有可能排列来获得函数i
的最小基础。
(我实际上现在想知道,如果有任何规范的数学方法来定义这个基础,那么我们得到了我们预期的结果......我最初是为了F(1:i)
和H^1
发明,但他们没有不太好用......)
H^2
命令function F = untangle(F)
nFuncs = size(F,1);
nPoints = size(F,2);
seminorm = @(x,i) sum(sum(abs(diff(x(:,1:i),1,2)))) + ...
sum(sum(abs(diff(x(:,1:i),2,2)))) + ...
sum(sum(abs(diff(x(:,1:i),3,2)))) + ...
sum(sum(abs(diff(x(:,1:i),4,2))));
doSwap = @(x,swap,i) [x(:,1:i-1), x(swap,i:end)];
swaps = perms(1:nFuncs);
normOfSwap = zeros(1,size(swaps,1));
for i = 2:nPoints
for j = 1:size(swaps,1)
normOfSwap(j) = seminorm(doSwap(F,swaps(j,:),i),i);
end
[~,j_bestSwap] = min(normOfSwap);
F = doSwap(F,swaps(j_bestSwap,:),i);
end
将解开您的功能:
它甚至可以用于更复杂的数据,例如这些改组的正弦波:
alpha2 = untangle(alpha2);
备注:我想如果您已经知道您的函数将是二次或其他特殊形式,RANSAC对于大量函数来说会更好。如果没有给出具有相同x值间距的函数,这也可能很有用。