我是matlab的初学者,所以我在理解区分点运算符和for循环时遇到了一些麻烦。 给定一个列向量(它是一个非常长的列向量)。我们得到以下等式......
f(x)= 0.2 * x ^ 3 +(1/3)*(x ^ 2-1)+ 2 * cos(x)+ 3 * cos(10x)
我需要使用点运算符和for循环的方法来创建2个图和时间(使用tic,toc)
然而,使用点运算符意味着使用
等式中的。^或。*
?如果是这种情况,我是否仍然需要使用它来进行for循环? 任何澄清或协助将不胜感激!我真的不明白我会怎么写这些...
答案 0 :(得分:1)
以点为前缀的运算符称为元素运算符。它对数组的每个元素执行操作(在检查所有涉及的数组具有相同数量的元素之后)。因此,您不需要使用此运算符进行for循环,这是隐含的。这称为矢量化。
例如:
C = A.*B;
相当于:
C = zeros(size(C));
for i=1:numel(A)
C(i) = A(i)*B(i);
end
但第一个是经过大量优化的。因此,强烈建议尽可能使用矢量化运算符。
答案 1 :(得分:0)
你的x是一个定义长度和步长的矢量,例如它可以是:
x = 1:1:100 %generates 1,2,3....100
x = 1:0.1:10 %generates 0.1,0.2,0.3....10
所以如果你想写一个x函数(它是一个向量),为了速度的目的,你可能想在matlab中使用。*表示的点积。在你的情况下,你可以这样做:
f(x)=0.2.*x.^3 + (1/3).*(x.^2-1) + 2.*cos(x) +3.*cos(10x)
更昂贵的计算方法是使用for循环:
for x = 1:100
f(x)=0.2*x^3 + (1/3)*(x^2-1) + 2*cos(x) +3*cos(10x)
end
figure
plot(f)
答案 2 :(得分:0)
你的for循环中的问题是你覆盖fx2的值,在每次迭代中你给它一个新的值,但它总是保持1x1的大小。对于代码中的最小更改,您可以执行以下操作:
fx2=[];
for x = A(:,4)
fx2 = [fx2 0.2*x^3+(1/3)*(x^2-1)+2*cos(x)+3*cos(10*x)];
end
plot(x,fx2)
这样,你在每次迭代时在向量fx2中添加一个新值而不是覆盖,(fx2将是1x1然后是1x2 ......)。但请注意,这根本没有优化,因为有一个可以避免的for循环,但也因为fx2的大小在每次迭代时都会发生变化。另一个更好的解决方案是使用正确的大小预定义fx2,然后在循环中,在第i次迭代时更改其第i个值。