是否可以在 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 初学者....

您可以在实现函数时通过组合 vararginvarargoutargn() 来完成类似的事情。看看下面的例子:

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 将是 A1y 将是 B1
  • [x,y,z] = pivota_parcial(A,B,n,k,np);x 将是 A1y 将是 B1z 将是 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 个输出调用此函数的能力。