是否可以在 Scilab 中重载函数?
Is it possible to overload functions in Scilab?
我想知道如何在 scilab 中重载函数。好像不像C++那么简单。例如,
function [A1,B1,np1]=pivota_parcial(A,B,n,k,np)
.......//this is just an example// the code doesn't really matter
endfunction
//has less input/output variables//operates differently
function [A1,np1]=pivota_parcial(A,n,k,np)
.......//this is just an example// the code doesn't really matter
endfunction
谢谢
scilab 初学者....
您可以在实现函数时通过组合 varargin
、varargout
和 argn()
来完成类似的事情。看看下面的例子:
function varargout = pivota_parcial(varargin)
[lhs,rhs] = argn();
//first check number of inputs or outputs
//lhs: left-hand side (number of outputs)
//rhs: right-hand side (number of inputs)
if rhs == 4 then
A = varargin(1); B = 0;
n = varargin(2); k = varargin(3);
np = varargin(4);
elseif rhs == 5 then
A = varargin(1); B = varargin(2);
n = varargin(3); k = varargin(4);
np = varargin(5);
else
error("Input error message");
end
//computation goes on and it may depend on (rhs) and (lhs)
//for the sake of running this code, let's just do:
A1 = A;
B1 = B;
np1 = n;
//output
varargout = list(A1,B1,np1);
endfunction
首先,您使用 argn()
检查传递给函数的参数数量。然后,您按照需要的方式重命名它们,执行 A = varargin(1)
等等。请注意 B
,在 4 个输入的情况下不是输入,现在设置为常量。也许你真的需要它的价值,也许不需要。
说完一切后,您需要设置输出,这里是仅使用 varargout
可能无法满足您需求的部分。如果按原样使用最后一行,varargout = list(A1,B1,np1)
,您实际上可以使用 0 和最多 3 个输出调用该函数,但它们将按照它们在 list()
中出现的相同顺序提供,像这样:
pivota_parcial(A,B,n,k,np);
:将运行和第一个输出A1
传递,但不会存储在任何变量中。
[x] = pivota_parcial(A,B,n,k,np);
:x
将是 A1
。
[x,y] = pivota_parcial(A,B,n,k,np);
:x
将是 A1
,y
将是 B1
。
[x,y,z] = pivota_parcial(A,B,n,k,np);
:x
将是 A1
,y
将是 B1
,z
将是 np1
。
如果您特别需要更改输出的顺序,则需要执行与输入相同的操作:检查输出的数量并使用它来为每种情况定义 varargout
.基本上,您必须按以下内容更改最后一行:
if lhs == 2 then
varargout = list(A1,np1);
elseif lhs == 3 then
varargout = list(A1,B1,np1);
else
error("Output error message");
end
请注意,即使这样做,也可以保留使用 0 和最多 2 或 3 个输出调用此函数的能力。
我想知道如何在 scilab 中重载函数。好像不像C++那么简单。例如,
function [A1,B1,np1]=pivota_parcial(A,B,n,k,np)
.......//this is just an example// the code doesn't really matter
endfunction
//has less input/output variables//operates differently
function [A1,np1]=pivota_parcial(A,n,k,np)
.......//this is just an example// the code doesn't really matter
endfunction
谢谢
scilab 初学者....
您可以在实现函数时通过组合 varargin
、varargout
和 argn()
来完成类似的事情。看看下面的例子:
function varargout = pivota_parcial(varargin)
[lhs,rhs] = argn();
//first check number of inputs or outputs
//lhs: left-hand side (number of outputs)
//rhs: right-hand side (number of inputs)
if rhs == 4 then
A = varargin(1); B = 0;
n = varargin(2); k = varargin(3);
np = varargin(4);
elseif rhs == 5 then
A = varargin(1); B = varargin(2);
n = varargin(3); k = varargin(4);
np = varargin(5);
else
error("Input error message");
end
//computation goes on and it may depend on (rhs) and (lhs)
//for the sake of running this code, let's just do:
A1 = A;
B1 = B;
np1 = n;
//output
varargout = list(A1,B1,np1);
endfunction
首先,您使用 argn()
检查传递给函数的参数数量。然后,您按照需要的方式重命名它们,执行 A = varargin(1)
等等。请注意 B
,在 4 个输入的情况下不是输入,现在设置为常量。也许你真的需要它的价值,也许不需要。
说完一切后,您需要设置输出,这里是仅使用 varargout
可能无法满足您需求的部分。如果按原样使用最后一行,varargout = list(A1,B1,np1)
,您实际上可以使用 0 和最多 3 个输出调用该函数,但它们将按照它们在 list()
中出现的相同顺序提供,像这样:
pivota_parcial(A,B,n,k,np);
:将运行和第一个输出A1
传递,但不会存储在任何变量中。[x] = pivota_parcial(A,B,n,k,np);
:x
将是A1
。[x,y] = pivota_parcial(A,B,n,k,np);
:x
将是A1
,y
将是B1
。[x,y,z] = pivota_parcial(A,B,n,k,np);
:x
将是A1
,y
将是B1
,z
将是np1
。
如果您特别需要更改输出的顺序,则需要执行与输入相同的操作:检查输出的数量并使用它来为每种情况定义 varargout
.基本上,您必须按以下内容更改最后一行:
if lhs == 2 then
varargout = list(A1,np1);
elseif lhs == 3 then
varargout = list(A1,B1,np1);
else
error("Output error message");
end
请注意,即使这样做,也可以保留使用 0 和最多 2 或 3 个输出调用此函数的能力。