所以我有这个代码,
clc
clear all
close all
a = [1,2];
b = [1,1];
r = sqrt((a(:,1) + b(:,1))^2+((a(:,2) + b(:,2))^2));
finished=false;
while ~finished
%default case, finish if case is done
finished=true;
if r<5
display('reaching target')
a = a+1;
b = b+1;
%start from begin in this case:
finished=false;
elseif r>5
disp('job done')
end
end
现在我想要的是获取a
和b
的初始值,计算r
,以及r<5
是否显示达到目标并从头重新开始的代码将a
和b
的每个分量的值增加1之后的顶部再次重复该事物,如果r
的值小于5,则再次重复该值,然后再增加值。如果r>5
的值显示'job done'
并停止运行代码。
答案 0 :(得分:1)
我想你是在问如何避免重复计算循环中r
的公式。您可以使用anonymous function来执行此操作。
calc_r = @(x, y) sqrt((x(:,1) + y(:,1))^2 + ((x(:,2) + y(:,2))^2));
然后调用此函数以在需要时更新r
r = calc_r(a, b);
答案 1 :(得分:1)
每次更新r
和a
时,您都需要重新计算b
,如下所示:
a = [1,2];
b = [1,1];
r = sqrt((a(:,1) + b(:,1))^2+((a(:,2) + b(:,2))^2));
finished=false;
while ~finished
%default case, finish if case is done
finished=true;
r = sqrt((a(:,1) + b(:,1))^2+((a(:,2) + b(:,2))^2));
if r<5
display('reaching target')
a = a+1;
b = b+1;
%start from begin in this case:
finished=false;
elseif r>5
disp('job done')
end
end
你的向量是1维的,这意味着你不需要:
,所以写一个更简单的方法就是:
r = sqrt((a(1) + b(1))^2+((a(2) + b(2))^2));
您确实不需要if
和elseif
来确定何时停止,您可以将其直接用作while
中的输入。我可能会做这样的事情(假设你不想使用匿名函数等大幅改变你的方法。)。
a = [1,2];
b = [1,1];
while sqrt((a(1) + b(1))^2 + (a(2) + b(2))^2) < 5
a = a + 1;
b = b + 1;
disp('reaching target')
end
disp('job done')
如果你的方程式比上面的方程式更复杂,你可能想要像最初那样单独计算它(使代码可读)。我仍然建议你放弃if
和else
s。