输出函数的值

时间:2014-02-13 21:59:17

标签: matlab

我对函数的输出有疑问。这是我功能的一部分,我遇到了麻烦。

    function [T,p,rho] = atmplot(h);

    ...

    if (h>=0 & h<=11000)

        [T,p,rho] = Gradient(T_base,a1,h,h_base,p_base,g0,R);

    else

        [T_base,p_base,~] = Gradient(288.16,a1,11000,0,101325,g0,R);

        h_base=11000;

    end

    if (h>11000 & h<=25000);

        [T,p,rho] = Isothermal(T_base,h,h_base,p_base,g0,R)

    else 

        [T_base,p_base,~] = Isothermal(T_base,25000,h_base,p_base,g0,R);

        h_base=25000;

    end

这里,h是用户输入的值数组。当我输入介于0和11000之间的值时,返回的值是在一个数组中,但高于该值的任何内容都不会返回任何值。当它到达这一部分时:

    if (h>11000 & h<=25000);

        [T,p,rho] = Isothermal(T_base,h,h_base,p_base,g0,R)

    else 

        [T_base,p_base,~] = Isothermal(T_base,25000,h_base,p_base,g0,R);

        h_base=25000;

    end

如果我输入介于11000和25000之间的值,则不会计算[T,p,rho],而是计算新的T_basep_base。我希望它为0:h中的每个变量输出一个值数组。有什么办法可以实现吗?这是我们的教师给我们使用的布局,但它不起作用。使用的两个函数可以正常工作,因为我在另一个脚本中没有问题地使用它们。如果您需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

如果h是向量或数组而不是标量,则if语句不正确。类似h>=0 & h<=11000的语句返回与h大小相同的逻辑(布尔)数组。但是,if语句仅对标量进行操作。如果h>=0 & h<=11000返回一个向量,则只使用第一个元素来决定执行哪个代码。

如果您仍想传递h的向量(或数组),则需要对if语句及其中的所有代码进行向量化。函数anyall可能对此有所帮助,例如:

if all(h(:)>=0 & h(:)<=11000)

    ... % All h in first range

elseif all(h(:)>11000 & h(:)<=25000)

    ... % All h in second range

elseif all(h(:)>=0 & h(:)<=25000)

    ... % Some h in first range and some in second, requires more processing

else

    ... % Case where all h outside of both ranges

end

另一种选择是将if语句包装在for循环中并迭代h的每个值 - 可能是这样的:

numh = numel(h);
T = zeros(numh,1);
p = zeros(numh,1);
rho = zeros(numh,1);
for i = 1:numh
    ...

    if h(i)>=0 && h(i)<=11000
        [T(i),p(i),rho(i)] = Gradient(T_base,a1,h(i),h_base,p_base,g0,R);
    else
        [T_base,p_base,~] = Gradient(288.16,a1,11000,0,101325,g0,R);
        h_base=11000;
    end

    ...
end

您必须在两种情况下填写详细信息,因为您的示例代码非常不完整。正如您所看到的那样,将atmplot主函数放在for循环中并迭代h的元素可能会更容易。