Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab:计算时如何绘制值?_Matlab_Plot - Fatal编程技术网

Matlab:计算时如何绘制值?

Matlab:计算时如何绘制值?,matlab,plot,Matlab,Plot,在matlab中有什么方法可以在运行时绘制值?以某种方式将x和y值一次传递给绘图函数?我有一个非常昂贵的for循环,我认为在循环中直接使用plot的唯一方法(我想我在某人的代码中看到了这一点)可能是在数组中保存每个y值。然而,这给了我一个错误,例如:试图访问Y(1.00202);索引必须是正整数或逻辑。 示例代码: function n = get_nodes(x_s, x_e, e_k) y_prev = 0; y_curr = 1; h = 10^-5; n = 0;

在matlab中有什么方法可以在运行时绘制值?以某种方式将x和y值一次传递给绘图函数?我有一个非常昂贵的for循环,我认为在循环中直接使用plot的唯一方法(我想我在某人的代码中看到了这一点)可能是在数组中保存每个y值。然而,这给了我一个错误,例如:
试图访问Y(1.00202);索引必须是正整数或逻辑。

示例代码:

function n = get_nodes(x_s, x_e, e_k)
    y_prev = 0; y_curr = 1;
    h = 10^-5;
    n = 0;
    for x = x_s+0.1:h:x_e-0.1
        a = 2 + (5/6)*forcing(x, e_k)*h^2;
        b = 1 - (1/12)*forcing(x-h, e_k)*h^2;
        c = 1 - (1/12)*forcing(x+h, e_k)*h^2;
        y_next = (a * y_curr + b * y_prev)/c;
        y_prev = y_curr;
        y_curr = y_next;
        if (y_next == e_k) 
            n = n + 1;
        end
        % gives empty plot 
        plot(x, y_curr);
    end   

end

如果要在计算时进行打印,则需要定义循环中从上一点到当前点的直线,并保留上一个点。可以将打印线更改为:

    hold on
    plot([x-h x],[y_prev y_curr]);

我建议设置循环打印的打印句柄对象,而不是每次创建新打印。比如说,

x = 1:100;
% Initialise plot handle
h = plot(nan,nan);

for iter = 1:1e2
   y = rand + rand*x + rand*(x.^2 );
   % set appropriate values of handle
   set(h, {'XData','YData'}, {x, y});
   drawnow;
end

通过这种方式,
绘图
句柄只创建一次,其属性在循环中设置。

Kedarp的回答显示了如何逐点更新绘图,但您还提到,由于索引问题,无法在运行时存储值

这种方法还可以整理您的代码,不再需要
y\u curr
y\u next
y\u prev
,因此运行速度可能会更快一些:

function n = get_nodes(x_s, x_e, e_k)
    h = 10^-5;
    n = 0;
    x = x_s+0.1:h:x_e-0.1; % Set up x vector
    y = zeros(size(x));    % pre-allocate vector for y_curr values
    y(2) = 1;              % You previously called this y_curr, already y_prev = Y(1) = 0
    for ii = 3:numel(x)    % notice in particular that the loop starts from 3, for y(ii-2)
        a = 2 + (5/6)*forcing(x(ii), e_k)*h^2;
        b = 1 - (1/12)*forcing(x(ii)-h, e_k)*h^2;
        c = 1 - (1/12)*forcing(x(ii)+h, e_k)*h^2;
        % Assign next y value, swapping which value is current happens naturally
        y(ii) = (a * y(ii-1) + b * y(ii-2))/c;           
    end     
    n = sum(y == e_k);     % now we have y stored, we can get n outside the loop
    plot(x,y)              % can just plot all at once...
end

编辑:如果你更聪明,你会把
a,b,c
计算也带到
for
循环之外!由于每次计算3个相邻点,因此每次计算
强制力(x(ii),e_k)
3次


如果您设置了
forcing
,这样它就可以采用向量
x
,您可以调用
f=forcing(x,e_k)
一次,然后您可以定义
a
b
c
,并在循环中简单地迭代
y
那肯定会节省时间。

不幸的是,情节中仍然没有任何要点。哇,这真的很有魅力,非常感谢你的建议。强制在具有单个参数的其他函数中使用,不确定是否可以使函数具有可变数量的参数或检查是否传递了数组?您需要研究“元素操作”(在标准运算符之前使用点)以及可能的
bsxfun
,这些将有助于您创建既适用于标量又适用于向量的函数,Matlab的效率在于矢量化!