创建具有可变输入数量的函数?

时间:2016-10-07 04:24:35

标签: matlab function matlab-deployment

我想在MATLAB中定义以下函数:

file = @(var1,var2,var3,var4) ['var1=' num2str(var1) 'var2=' num2str(var2) 'var3=' num2str(var3) 'var4=' num2str(var4)'];

但是,我想在添加更多参数时扩展该功能;如果我想添加变量vark,我希望函数为:

file = @(var1,var2,var3,var4,vark) ['var1=' num2str(var1) 'var2=' num2str(var2) 'var3=' num2str(var3) 'var4=' num2str(var4) 'vark=' num2str(vark)'];

有没有系统的方法来做到这一点?

3 个答案:

答案 0 :(得分:2)

fprintfvarargin一起使用:

f = @(varargin) fprintf('var%i= %i\n', [(1:numel(varargin));[varargin{:}]])
f(5,6,7,88)
var1= 5
var2= 6
var3= 7
var4= 88

我使用的格式为:'var%i= %i\n'。这意味着它将首先写var然后%i说它应该输入一个整数。此后,它应该写下=后跟一个新号码:%i和换行符\n

它将为var%i选择奇数位置的整数,为实际数字选择偶数位置的整数。由于MATLAB中的线性索引是列的列,我们将向量[1 2 3 4 5 ...]置于顶部,将变量的内容置于第二行。

顺便说一下:如果你真的想要它在问题中指定的格式,请跳过\n

f = @(varargin) fprintf('var%i= %i', [(1:numel(varargin));[varargin{:}]])

f(6,12,3,15,5553)
var1= 6var2= 12var3= 3var4= 15var5= 5553

另外,您可以change the second %i to floats (%f), doubles (%d) etc.

如果您想在输入中使用实际变量名称var1, var2, var3, ...,那么我只能说一件事:不要!这是一个可怕的想法。使用单元格,结构或除编号变量名之外的任何其他内容。

只是要冷静清楚:不要在MATLAB中结合使用eval的输出! eval是邪恶的。 Mathworks实际上在官方文档中警告你这一点!

答案 1 :(得分:0)

如果您希望函数接受灵活数量的输入参数,则需要varargin

如果您希望最终字符串由您工作区中的变量名称组成,我找不到任何方法,因为您需要varargin然后看起来不可能。但是,如果您在字符串中使用var1var2,则可以定义此函数然后使用它:

function str = strgen(varargin)
str = '';
for ii = 1:numel(varargin);
    str = sprintf('%s var%d = %s', str, ii, num2str(varargin{ii}));
end
str = str(2:end); % to remove the initial blank space

它也与字符串兼容。测试它:

% A = pi;
% B = 'Hello!';

strgen(A, B)

ans =

var1 = 3.1416 var2 = Hello!

答案 2 :(得分:0)

如何多次调用函数作为参数个数?考虑到函数返回的字符串的具体形式,我写了这个,其中k被假定为' kth'的索引。要输入的变量。 Array var可以是数字参数的列表。

int* foo() {
  int a = 5;
  return &a;
}

int main() {
  int* p = foo();
  // Prints 5
  std::cout << "Coming from foo = " << *p << std::endl;
  *p = 8;
  // Prints 8
  std::cout << "Setting explicitly = " << *p << std::endl;
}