在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 :(得分: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--')