我对函数的输出有疑问。这是我功能的一部分,我遇到了麻烦。
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_base
和p_base
。我希望它为0:h
中的每个变量输出一个值数组。有什么办法可以实现吗?这是我们的教师给我们使用的布局,但它不起作用。使用的两个函数可以正常工作,因为我在另一个脚本中没有问题地使用它们。如果您需要任何其他信息,请与我们联系。
答案 0 :(得分:0)
如果h
是向量或数组而不是标量,则if
语句不正确。类似h>=0 & h<=11000
的语句返回与h
大小相同的逻辑(布尔)数组。但是,if
语句仅对标量进行操作。如果h>=0 & h<=11000
返回一个向量,则只使用第一个元素来决定执行哪个代码。
如果您仍想传递h
的向量(或数组),则需要对if
语句及其中的所有代码进行向量化。函数any
和all
可能对此有所帮助,例如:
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
的元素可能会更容易。