我有一个函数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
提供的相应信息)?
答案 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)
这将对您的数据进行排序,仅保留唯一值。 iv
和iw
是索引向量,允许您重新排序v - &gt; w对任何其他数据集,因为w = v(iv)和v = w(iw)。
现在使用w
代替v
来绘制轮廓。然后,您可以使用iw
'取消'C
中的数据。如有必要,请查看Contour Properties > Contour Matrix了解C
的规范。