调用if else输出到其他脚本

时间:2017-08-24 16:54:13

标签: matlab function if-statement

我写了一个名为“tension.m”的函数,其中我使用了if else条件,如下所示。

function [T,T_earlyvalues,T_latervalues] = tension(u,sigma,G,N,K)
%the values of sigma,G,N,K can be taken arbitrary.
sigma=2; G=3;N=8;K=1; v=1;
w=2.2;
if u<w
  T =v*sqrt(sigma+G^2/(N-K));
  T_earlyvalues=T;
else
  T=(2*v)*sqrt(sigma+G^2/(N+K));
  T_latervalues=T;
end

现在在另一个脚本“myvalues.m”中我需要分别调用T_earlyvalues和T_latervalues。

%have some coding before this part
sigma0=2400; lambda=1.3; v=2; sigma=2; G=3;N=8;K=1;  
u=0:0.01:5;  
T=tension(u,sigma,G,N,K);
T_earlyvalues=tension(u,sigma,G,N,K);
T_latervalues=tension(u,sigma,G,N,K);
deltaA=T_earlyvalues*sigma0*pi;
deltaB=T_latervalue*lambda*pi/2;
%have some coding after this part

我如何将从tension.m函数if-else语句下的所述值调用到myvalues.m脚本?

2 个答案:

答案 0 :(得分:1)

您已定义tension函数,使其返回三个输出。

如果通过只需要一个输出来调用该函数,该函数将返回第一个值,在您的情况下为T

这意味着

T=tension(u,sigma,G,N,K);

由于T是第一个输出参数

,因此工作正常
T_earlyvalues=tension(u,sigma,G,N,K);
T_latervalues=tension(u,sigma,G,N,K);

不起作用,因为实际上tension会返回第一个值(T,分别是第二个和第三个值。)

您可以通过这种方式改变上述两个电话:

[~,T_earlyvalues,~]=tension(u,sigma,G,N,K);
[~,~,T_latervalues]=tension(u,sigma,G,N,K);

~允许避免函数返回输出参数。

您可以找到additional information here

请注意,在您的T_earlyvalue块中未设置elseT_latervalue块中if的设置相同。

这会产生错误,例如

  

在调用张力期间未分配输出参数T_earlyvalue(可能还有其他值)

  

输出参数T_latervalues(可能还有其他)在调用张力期间未分配

您可以在函数开头将输出值初始化为默认值,例如:

T=NaN
T_earlyvalue=NaN
T_latervalues=NaN

然后,您可以使用这些特殊值(或您要使用的任何其他值)来跟踪,例如,if块是否已被执行或else

希望这个停止,

Qapla'

答案 1 :(得分:0)

这里似乎存在许多问题,其中最重要的是关于输出参数列表在定义或调用函数时如何工作的一些混淆。我建议从this documentation开始,以便更好地了解如何创建和调用函数。 然而,这个问题有点没有用,因为更大的问题是你如何使用conditional statement ......

您正在尝试将向量 u传递给您的函数tension,并且我可以告诉您要返回向量T,其中T的{​​{1}}值使用与u < w T的值不同的公式计算得出。您的条件声明不会为您完成此操作。相反,您需要使用logical indexing来编写函数,如下所示:

u >= w

现在你可以调用这个函数,捕获第二个输出参数,用于识别“早期”和“晚期”值:

function [T, index] = tension(u, sigma, G, N, K)
  T = zeros(size(u));  % Initialize T to a vector of zeroes
  w = 2.2;
  index = (u < w);  % A logical vector, with true where u < w, false where u >= w
  T(index) = u(index)*v*sqrt(sigma+G^2/(N-K));       % Formula for u < w
  T(~index) = 2*(u(~index)-v)*sqrt(sigma+G^2/(N+K));  % Formula for u >= w
end

然后,您可以随意使用子向量sigma0 = 2400; lambda = 1.3; v = 2; sigma = 2; G = 3; N = 8; K = 1; u = 0:0.01:5; [T, earlyIndex] = tension(u, sigma, G, N, K); % Call function T_earlyvalues = T(earlyIndex); % Use logical index to get early T values T_latervalues = T(~earlyIndex); % Use negated logical index to get later T values T_earlyvalues