Matlab - 从具有多个条件的向量绘制值

时间:2014-06-11 11:40:41

标签: matlab if-statement vector conditional-statements

我的价值在这里:

x=[0.125  0.250  0.375  0.500  0.625  0.750  0.875 1.000  1.125  1.250  ...]  
y=[4.1  4.6  4.3  4.4  4.8  4.6  4.3  4.9 4.1  4.2 ...]  

然后我想要所有值>4.5

  • 如果我有一个孤立的值,它应该被丢弃;
  • 如果我有一个孤立的值,但它被两个值>4.5包围,那么它应该算在内。

所以结果应该是:

xx=[0.625  0.750  0.875 1.000  ...]
yy=[4.8  4.6  4.3  4.9  ...]

plot(x,y,'g',xx,yy,'k')

2 个答案:

答案 0 :(得分:0)

在我看来,这就是你想要的:

x=[0.125  0.250  0.375  0.500  0.625  0.750  0.875 1.000  1.125  1.250]  
y=[4.1  4.6  4.3  4.4  4.8  4.6  4.3  4.9 4.1  4.2]  

xx = x(y > 4.5 | [0, (arrayfun(@(n) (y(n-1) > 4.5 & y(n+1) ...
   > 4.5 & y(n) <= 4.5), 2:length(y)-1)), 0])
yy = y(y > 4.5 | [0, (arrayfun(@(n) (y(n-1) > 4.5 & y(n+1) ...
   > 4.5 & y(n) <= 4.5), 2:length(y)-1)), 0])

xx =
   0.25000   0.62500   0.75000   0.87500   1.00000
yy =
   4.6000   4.8000   4.6000   4.3000   4.9000

更新:使用评论中的新示例数据:

y = [4.9 3 4.6 4.1 4.7 4.1 4.2 4.6 4.3 4.9];

yy =
    4.9000    3.0000    4.6000    4.1000    4.7000    4.6000    4.3000    4.9000

也可以是你想要的:

xx = x((y > 4.5 & [1, (arrayfun(@(n) (y(n-1) > 4.5 | y(n+1) ...
     > 4.5), 2:length(y)-1)), 1])  | [0, (arrayfun(@(n) (y(n-1) > 4.5 & y(n+1) ...
     > 4.5 & y(n) <= 4.5), 2:length(y)-1)), 0])
yy = y((y > 4.5 & [1, (arrayfun(@(n) (y(n-1) > 4.5 | y(n+1) ...
     > 4.5), 2:length(y)-1)), 1])  | [0, (arrayfun(@(n) (y(n-1) > 4.5 & y(n+1) ...
     > 4.5 & y(n) <= 4.5), 2:length(y)-1)), 0])

xx =
   0.62500   0.75000   0.87500
yy =
   4.8000   4.6000   4.3000

答案 1 :(得分:0)

另一个使用for循环的解决方案,因为原始问题标有for-loop。这完全返回了示例的解决方案:

v=[0,0,y,0,0];
u=[0,0,x,0,0];
for k=3:1:numel(v)
    if v(k)>4.5 && (v(k-2)>4.5 || v(k-1)>4.5 || v(k+1)>4.5 || v(k+2)>4.5) 
    elseif v(k)<4.5 && v(k-1)>4.5 && v(k+1)>4.5 
    else
        v(k)=0;
    end
end
yy=v(v>0);
xx=u(v>0);
figure(2)
plot(x,y,'g',xx,yy,'k')

可以通过更改if个案来优化此代码。我使用了这个设置,因为它与问题完全一样。