为什么轮廓排序轮廓矩阵C中的数据?

时间:2015-12-22 13:46:24

标签: matlab sorting contour

我有一个函数f(x,y),我想绘制f相对于固定向量的等级曲线

v=(v1,...,vn)  % not sorted

使用meshgrid [X,Y]

这可以使用函数[C,h]=contour(X,Y,f,v)来完成。

但是,当我想要恢复每个级别曲线的数据时,我发现C已经以越来越多的方式对我的向量v进行了排序。

我希望以这样的方式恢复C,使其保持v的固定顺序。

这可以通过v上的组件循环使用

逐个完成
[Ci,hi]=contour(X,Y,f,[vi,vi])

但我发现v的组件数量足够大(比如10000个组件)时效率很低。

如何从v恢复原始未排序的向量C(包含C提供的相应信息)?

2 个答案:

答案 0 :(得分:0)

我怀疑你问题的答案是MATLAB在跟踪轮廓之前将unique应用于轮廓水平。

我不确定恢复未排序的向量是否有用,因为每个级别不一定有一个轮廓线/循环。所以一般来说,这个轮廓矩阵必须在某个循环中处理,我相信。

根据您打算如何处理轮廓线数据,我过去所做的事情可能会有用。 (我基本上已经从我之前写的一个函数中逐字复制了代码。)

此代码创建一个掩码矩阵,使我能够从轮廓矩阵中提取每个级别的所有点:

% Create the contours
[c, ch] = contour(X, Y, f, v);

% Create a mask for the contour matrix for each level.
l = numel(v);
n = size(c,2);
cmask = false(l,n);
fCtrNotLoop = false(1,l);
% Don't think this is possible without a loop...
ii = 1;
while ii < n
    m = c(2,ii);
    cmask(v == c(1,ii), ii+1:ii+m) = true;
    % Remove duplicate point of loops.
    if all(c(:,ii+1)==c(:,ii+m))
        cmask(v == c(1,ii), ii+m) = false;
    else
        fCtrNotLoop(lvls == c(1,ii)) = true;
    end
    ii = ii + m + 1;
end

(您可能想要也可能不想删除关闭循环的重复点 - 我需要为我的应用程序。)

然后在级别v(jj)获取轮廓中的点使用类似:

pts = c(:,cmask(jj,:));

稍加修改后,您可以使用cmask重新排序轮廓矩阵:将ii+1:ii+m行中的cmask(...) = true更改为ii:ii+m并删除重复点{{1}声明。然后遍历每个级别以填充if

的副本
c

由于% WARNING: Untested code follows! cnew = c; kk = 1; for jj = 1 : l s = sum(cmask(jj, :)); cnew(:, kk:kk+s-1) = c(:, cmask(jj, :)); kk = kk + s; end 的维度为cmask,如果每个级别都有大量的等级点和大量的轮廓点,那么内存消耗可能会成为问题,并且可能需要修改此提取/重新排序方法 - 即分别处理每个级别当然会更慢。

答案 1 :(得分:0)

我认为使用

预先自己排序轮廓水平是最简单的
[w,iv,iw] = unique(v)

这将对您的数据进行排序,仅保留唯一值。 iviw是索引向量,允许您重新排序v - &gt; w对任何其他数据集,因为w = v(iv)和v = w(iw)。

现在使用w代替v来绘制轮廓。然后,您可以使用iw '取消'C中的数据。如有必要,请查看Contour Properties > Contour Matrix了解C的规范。