2014-09-28 52 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