在Matlab中分离'纠缠'向量

时间:2015-01-28 19:23:16

标签: matlab matrix vector difference

我有一组三个向量(存储在3xN矩阵中),它们是“纠缠的”(例如,第二行中的某些值应该在第三行,反之亦然)。这种“纠缠”是基于查看绘制alpha2的图形。为了分离矢量,我使用基于差分的方法,其中我计算一个值与三个下一个值的差值(例如,比较(1,i)和(:,i + 1))。然后我采取最低限度并存储。该方法用于分离三个向量中的两个,但不是最后一个。

我想知道你们是否可以与我分享你的想法如何解决这个问题(如果可能的话)。我在下面添加了我的编码。

提前致谢!

数字中的问题: 'Entangled state' 'Separated state'

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)

1 个答案:

答案 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 将解开您的功能:Untangle

它甚至可以用于更复杂的数据,例如这些改组的正弦波:

alpha2 = untangle(alpha2);

Sinus

备注:我想如果您已经知道您的函数将是二次或其他特殊形式,RANSAC对于大量函数来说会更好。如果没有给出具有相同x值间距的函数,这也可能很有用。