代码之家  ›  专栏  ›  技术社区  ›  Matlaber

选择并绘制高于阈值的值

  •  0
  • Matlaber  · 技术社区  · 7 年前

    我有一个图,其中有一些噪声分量。我计划从该图中选择数据,最好高于阈值。在我的情况下,我计划将其保持在Y轴上的2.009。画出只在上面的线。如果有任何东西在下面,我想把它画成0。 如图所示

    enter image description here

    t1=t(1:length(t)/5);  
    t2=t(length(t)/5+1:2*length(t)/5);
    t3=t(2*length(t)/5+1:3*length(t)/5);
    t4=t(3*length(t)/5+1:4*length(t)/5);
    t5=t(4*length(t)/5+1:end);
    X=(length(prcdata(:,4))/5);
    a = U(1 : X);
    b = U(X+1: 2*X);
    c = U(2*X+1 : 3*X);
    d = U(3*X+1 : 4*X);
    e = U(4*X+1 : 5*X);
    figure;
    subplot (3,2,2)
    plot(t1,a);
    subplot (3,2,3)
    plot(t2,b);   
    subplot(3,2,4)
    plot(t3,c);
    subplot(3,2,5)
    plot(t4,d);
    subplot(3,2,6)
    plot(t5,e);
    subplot(3,2,1)
    plot(t,prcdata(:,5));
    figure;
    A=a(a>2.009,:);
    plot (t1,A);
    

    此代码将图像中的数据(每2.8秒分成5个,我计划在前2.8秒使用阈值。此外,我还有另一个代码,但我只是不确定它是否有效,因为需要很长时间才能分析

    figure;
    A=a(a>2.009,:);
    plot (t1,A);
    for k=1:length(a)
        if a(k)>2.009
            plot(t1,a(k)), hold on
        else 
            plot(t1,0), hold on
        end
    end
    hold off
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Durkee    7 年前

    问题是,您试图绘制可能数千次,并在绘图上添加数千个点,这会在您的计算机上造成严重的内存和图形问题。您可以做的一件事是预先处理所有信息,然后一次绘制所有信息,这将大大减少所需时间。

    figure
    threshold = 2.009;
    A=a>threshold; %Finds all locations where the vector is above your threshold
    plot_vals = a.*A; %multiplies by logical vector, this sets invalid values to 0 and leaves valid values untouched
    plot(t1,plot_vals)
    

    由于MATLAB是一种高度矢量化的语言,这种格式不仅由于缺少for循环而计算速度更快,而且在计算机上的强度也要小得多,因为图形引擎不需要单独处理数千个点。

    MATLAB处理绘图的方式是对每一行进行处理。当绘制向量时,MATLAB能够简单地将向量存储在一个地址中,并在绘制时调用一次。然而,当单独调用每个点时,MATLAB必须将每个点存储在内存中的单独位置,并单独调用所有点,并以图形方式完全单独处理每个点。

    此处按请求编辑 绘图(t1(A),plot\u vals(A))