matlab分段两个变量函数

时间:2016-11-13 15:23:54

标签: matlab

我正在尝试绘制两个变量的分段函数,但我编写的代码不起作用。

这是我的代码

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)

有人可以帮助我吗?

2 个答案:

答案 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 。

正如之前(现已删除)的回答中所提出的,您不需要显式写.*而不是*,因为您正在处理标量而不是向量或矩阵。如果要计算相同大小的两个矢量/矩阵之间的逐点乘法,则只需要.*。使用标量,两者都起作用并导致相同的结果,但根本不需要它。

然后,请勿使用lengthlength只返回最大数组维度的长度。如果您将K更改为0到1000,或者执行大小为0.1的步骤,则会失败。而是使用size来获取指定维度的长度。使用i的第一维和q的第二维。

还有一个提示:don't use i or j as variables in MATLAB,因为它们用于表示虚构单位。只需使用iik或您喜欢的任何其他名称即可。在我看来,在for循环中使用ij是一个坏习惯 - 而是使用一些有意义的名称,例如rowNumberimageNumber,或者适用于您的情况 - 所以阅读代码的人知道这个真正是什么。

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)