如何查找和绘制线的下限和上限

时间:2014-09-28 17:28:20

标签: matlab

在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

希望以上是有道理的。先感谢您。

1 个答案:

答案 0 :(得分:0)

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

输入 y ,两个所需的输出显然是向上 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方向的delta,以及重叠或超出边界的修复问题)将是:

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--')