Matlab:计算时如何绘制值?
在matlab中有什么方法可以在运行时绘制值?以某种方式将x和y值一次传递给绘图函数?我有一个非常昂贵的for循环,我认为在循环中直接使用plot的唯一方法(我想我在某人的代码中看到了这一点)可能是在数组中保存每个y值。然而,这给了我一个错误,例如: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;
试图访问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的效率在于矢量化!