分开';纠缠';Matlab中的向量

分开';纠缠';Matlab中的向量,matlab,matrix,vector,difference,Matlab,Matrix,Vector,Difference,我有一组三个向量(存储在3xN矩阵中),它们是“纠缠的”(例如,第二行中的一些值应该在第三行中,反之亦然)。这种“纠缠”是基于观察绘制alpha2的图形。为了分离向量,我使用基于差分的方法,计算一个值与下三个值之间的差(例如,将(1,I)与(:,I+1)进行比较)。然后我取最小值并存储它。该方法可以分离三个向量中的两个,但不能分离最后一个 我想知道你们是否可以和我分享你们的想法如何解决这个问题(如果可能的话)。我在下面添加了我的代码 提前谢谢 数字问题: 通过polyfit使用外推的解决方案:

我有一组三个向量(存储在3xN矩阵中),它们是“纠缠的”(例如,第二行中的一些值应该在第三行中,反之亦然)。这种“纠缠”是基于观察绘制alpha2的图形。为了分离向量,我使用基于差分的方法,计算一个值与下三个值之间的差(例如,将(1,I)与(:,I+1)进行比较)。然后我取最小值并存储它。该方法可以分离三个向量中的两个,但不能分离最后一个

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

提前谢谢

数字问题:

通过
polyfit
使用外推的解决方案: 想法非常简单:迭代所有位置
i
,并使用
polyfit
将度
d
多项式拟合到
d+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
用法: 命令
alpha2=untangle(alpha2)将解开您的函数:

它甚至应该适用于更复杂的数据,如这些混洗正弦波:

nPoints = 100;
nFuncs = 5;
t = linspace(0, 2*pi, nPoints);
F = bsxfun(@(a,b) sin(a*b), (1:nFuncs).', t);
for i = 1:nPoints
    F(:,i) = F(randperm(nFuncs),i);
end


备注:我想如果你已经知道你的函数是二次函数或其他特殊形式,那么对于更多的函数来说,这是个更好的主意。如果函数的x值间距不相同,这也可能很有用。

很抱歉我不知道,但我不清楚您的“纠缠”标准。你怎么知道一个向量中的一些值什么时候应该进入另一个向量?你在你的问题陈述中没有明确说明这一点。不,你一点也不无知。基本上,这个“纠缠”是基于这个图,我明白了。那太好了。那么看这个图是如何告诉你它是如何纠缠的呢?我同意这是一个奇怪的问题,一个仅仅通过矩阵alpha2无法解决的问题(因此,如果可能的话,我会说)。但是,如果绘制图形,您将看到曲线不是“平滑的”,基于此,您可以看到如果更改第2行和第3行的部分,将得到更平滑的曲线。ahhh.OK。我不认为你的意思是说数据是“纠缠”的。我想你的意思是说你的数据有一些噪音,你希望尽可能地过滤或消除这些噪音。本质上,您希望过滤每一行,使其变得“平滑”。是否允许对最终结果进行变异,或者只能使用向量本身的数据?我的意思是,对于每个可能“有噪声”的元素,输出是否仅限于选择数据中的一个点,或者我们是否可以以某种方式组合它们?也许是在当地的一个街区?@user5489:很乐意帮忙。你是从哪里得到这些乱序数据的?alpha2(它的三个向量)是立方公式的解。我使用讨论的方法获得了三种不同的解决方案(等式54-56)。不幸的是,没有必要对解决方案进行排序。Matlab中的根查找器函数也不会对解决方案进行排序(在许多情况下,情况更糟)。
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
nPoints = 100;
nFuncs = 5;
t = linspace(0, 2*pi, nPoints);
F = bsxfun(@(a,b) sin(a*b), (1:nFuncs).', t);
for i = 1:nPoints
    F(:,i) = F(randperm(nFuncs),i);
end