2014-09-28 47 views
2

在Matlab中,如何查找并绘图,例如线的下限和上限的10%。我想要容易计算并绘制2条限制线(蓝色;请参阅示例)给出红线。如何查找并绘制一条线的下限和上限

stairs([repmat(1,[10 1]); repmat(3,[10 1]); repmat(2,[10 1])],'r'), hold on 
stairs([repmat(1.1,[9 1]); repmat(3.1,[12 1]); repmat(2.1,[9 1])],'b--'), 
stairs([repmat(.9,[11 1]); repmat(2.9,[8 1]); repmat(1.9,[11 1])],'b--'), hold off 

希望以上作出敏感。先谢谢你。

回答

0

在这个非常具体的案例中,下面给出了一个有效的解决方案。

输入是ÿ和两个期望的输出是明显向上DN

fraction = .1; 

jUp = find(diff(y)>0); 
jDn = find(diff(y)<0); 

up = y + fraction; 
up(jUp) = up(jUp+1); 
up(jDn+1) = up(jDn); 

dn = y - fraction; 
dn(jUp+1) = dn(jUp); 
dn(jDn) = dn(jDn+1); 

但存在这个问题的许多普遍性,这种简单的方法不起作用。


甲更先进的方法(包括在x和y方向,和固定用的重叠或超过界限问题的增量)将是:

y = [1*ones([10 1]); 3*ones([10 1]); 2*ones([10 1])]; 

yFrac = .8; 
xFrac = 5; 

% generate x values 
x = 1:numel(y); 

% find indexes of change 
idx = find(diff(y))+1; 

% consider only changing points 
yNew = y([1;idx;end]); 
xNew = x([1;idx;end]); 

% find indexes of positive and negative change 
pIdx = find(diff(yNew)>0)+1; 
nIdx = find(diff(yNew)<0)+1; 

% determine down-shift 
yDn = yNew - yFrac; 
xDn = xNew; 
xDn(pIdx) = xDn(pIdx) + xFrac; 
xDn(nIdx) = xDn(nIdx) - xFrac; 

% fix dn-values that overlap 
oIdx = find(diff(xDn)<0); 
yDn(oIdx) = []; 
xDn(oIdx+1) = []; 

% determine up-shift 
yUp = yNew + yFrac; 
xUp = xNew; 
xUp(pIdx) = xUp(pIdx) - xFrac; 
xUp(nIdx) = xUp(nIdx) + xFrac; 

% fix up-values that exceed bounds 
epIdx = find(xUp>xNew(end)); 
yUp(epIdx+1) = []; 
xUp(epIdx) = []; 
enIdx = find(xUp<xNew(1)); 
yUp(enIdx-1) = []; 
xUp(enIdx) = []; 

% plot results 
figure(1) 
clf 
hold on 
stairs(xNew,yNew,'b') 
stairs(xDn,yDn,'r--') 
stairs(xUp,yUp,'r--') 
+0

感谢。我认为这会起作用。但是,我还需要将间隔移位,因此输入** b **周围存在“空间”。就像在我的例子中一样,无论是较低还是较高的行,点的数量都会发生变化。你知道一个方法来得到那个吗?在此先感谢:-) – etyM 2014-09-28 20:46:21

+0

对不起,我不明白你的问题。由于基于跳转索引的附加调整,实际上在左侧和右侧具有大小为1的空间。与您在问题中给出的示例中的空间相同。 – MeMyselfAndI 2014-09-29 18:12:45

+0

对不起。通过您提供的代码,我可以控制距离基线的限制程度。我是一个地平线的方式。不过,我也想以垂直方式进行控制。你能帮助我吗?这些线将由功能“楼梯”绘制,因此,我们所有这些都被认为是离散的 – etyM 2014-09-30 20:30:05