Plotting graph using for loop in MATLAB

后端 未结 2 1405
广开言路
广开言路 2020-12-07 03:29

I\'m trying to plot a simple graph using for loop as shown below

x=linspace(0,2*pi,100);
for i=1:numel(x)
    y=sin(x(i));
    plot(x(i),y)
    hold on
end
<         


        
2条回答
  •  有刺的猬
    2020-12-07 04:20

    Why this happens...

    With plot(x(i),y) you are plotting 100 single points (one in each iteration) and they are not shown by default. Therefore the plot looks empty.


    Solution 1: Vectorized calculation and direct plot

    I assume you meant to draw a continuous line. In that case no for-loop is needed because you can calculate and plot vectors directly in MATLAB. So the following code does probably what you want:

    x = linspace(0,2*pi,100);
    y = sin(x);
    plot(x,y);
    

    Note that y is a vector as well as x and that y(n) equals to sin(x(n)) for all n. If you want to plot the points itself, use LineSpec-syntax when calling plot like this1:

    plot(x,y,'*');
    

    1) Other types of points are possible as well, see the above linked documentation.


    Solution 2: Calculate values within for-loop and plot afterwards

    If you want to calculate the values within a for-loop and plot it afterwards: Pre-allocate the needed variable (in this case y), calculate the values within the for-loop and finally plot it with one single command after the calculation.

    x = linspace(0,2*pi,100);
    
    y = zeros(size(x));
    for i = 1:numel(x)
        y(i) = sin(x(i));
    end
    
    plot(x,y);
    

    Solution 3: Dynamically update plot while calculating

    In case you insist on plotting within each iteration, the previous code from Solution 2 can be expanded as follows: Create a figure, add an 'empty' plot to it and store its handle. Within the for-loop calculate the values and add them to the y-vector as shown above. As a last step you can update the plot by changing its XData and YData properties and calling drawnow. Note that calling plot every time within the for-loop is unnecessarily expensive and I don't recommend it.

    % create figure and plot
    figure;
    ph = plot(0,0);
    ax = gca;
    set(ax,'XLim',[0,2*pi]);
    set(ax,'YLim',[-1,1]);
    
    % calculate and update plot
    x = linspace(0,2*pi,100);
    y = zeros(size(x));
    for i = 1:numel(x)
        y(i) = sin(x(i));
        set(ph,'XData',x(1:i));
        set(ph,'YData',y(1:i));
        drawnow;
    end
    

提交回复
热议问题