我正在尝试绘制两个变量的分段函数,但我编写的代码不起作用。
这是我的代码
c=-0.5;
b=0.5;
L=0:1:100;
K=0:1:100;
[L,K]= meshgrid(L,K);
for i=1:length(L)
for q=1:length(K)
if
{
L(i)/K(q)>=-c
Z=(K(q).^b).*(L(i)+(b.*c).*K(q)).^(1-b);
else
Z=((-1/c)^b) .*(1-b).*(1-b);
}
end
end
end
surf(Z)
有人可以帮助我吗?
答案 0 :(得分:1)
您的代码的第一个问题是使用花括号{ ... }
。与许多其他编程语言(例如C或Java)不同,您不需要任何花括号来将多个命令组合在一起(例如,在if或for子句中)。相反,MATLAB使用end
语句,如下所示。
其次,在每次迭代中,您编写Z = ...
,在每次迭代中都会覆盖Z
。这样,您将在代码末尾获得一个单独的数字Z
。相反,您应该使用matrix indexing将计算结果写入(i,q)
中的Z
位置。这就像写Z(i,q) = ...;
一样简单。虽然这已经有效,但您应该preallocate Z
矩阵,这意味着您在for循环之前创建了一个零矩阵。然后MATLAB不必在每次迭代中增加矩阵的大小。这是使用zeros
函数完成的。
第三,您必须致电surf(L,K,Z)
而不是surf(Z)
才能使轴正确:使用surf(Z)
,它们将从1到101,而它们应该从0到100 。
正如之前(现已删除)的回答中所提出的,您不需要显式写.*
而不是*
,因为您正在处理标量而不是向量或矩阵。如果要计算相同大小的两个矢量/矩阵之间的逐点乘法,则只需要.*
。使用标量,两者都起作用并导致相同的结果,但根本不需要它。
然后,请勿使用length
。 length
只返回最大数组维度的长度。如果您将K
更改为0到1000,或者执行大小为0.1的步骤,则会失败。而是使用size
来获取指定维度的长度。使用i
的第一维和q
的第二维。
还有一个提示:don't use i
or j
as variables in MATLAB,因为它们用于表示虚构单位。只需使用ii
或k
或您喜欢的任何其他名称即可。在我看来,在for循环中使用i
和j
是一个坏习惯 - 而是使用一些有意义的名称,例如rowNumber
或imageNumber
,或者适用于您的情况 - 所以阅读代码的人知道这个真正是什么。
c=-0.5;
b=0.5;
L=0:1:100;
K=0:1:100;
[L,K]= meshgrid(L,K);
% Preallocate Z
Z = zeros(size(L,1), size(K,2));
for ii=1:size(L,1)
for q=1:size(K,2)
if L(ii)/K(q)>=-c
Z(ii,q) = (K(q)^b)*(L(ii)+(b*c)*K(q))^(1-b);
else
Z(ii,q) =((-1/c)^b)*(1-b)*(1-b);
end
end
end
surf(L,K,Z)
这样,您的代码可以毫无错误地运行,并按预期创建表面图。
答案 1 :(得分:0)
这是矢量化(一体化操作)matlab编码在效率方面带来巨大好处的一个典型例子:
c=-0.5;
b=0.5;
L=0:1:100;
K=0:1:100;
% slow loop-based method - shouldn't use meshgridded L and K here
Z = zeros(length(L), length(K));
for i=1:length(L)
for q=1:length(K)
if L(i)/K(q)>=-c
Z(i,q) = (K(q)^b)*(L(i)+(b*c)*K(q))^(1-b);
else
Z(i,q) =((-1/c)^b)*(1-b)*(1-b);
end
end
end
figure(1)
surf(L,K,Z)
% much faster vectorized approach
ZZ = zeros(length(L), length(K));
[KK,LL]= meshgrid(K, L); % corrected order of meshgrid inputs and outputs
% ---alternatively you could use [LL,KK]=ndgrid(L,K);
case1 = LL ./ KK >= -c;
case2 = ~case1;
ZZ(case1) = KK(case1).^b .* ( LL(case1) + (b*c) .* KK(case1) ) .^ (1 - b);
ZZ(case2) = ((-1/c)^b)*(1-b)*(1-b);
figure(2)
surf(L,K,ZZ)