创建一个输入数量可变的函数?

Creating a function with variable number of inputs?

我正在尝试在 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)'];

有系统的方法吗?

如果你想让一个函数接受灵活数量的输入参数,你需要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!

调用函数的次数与参数个数一样多如何?我写这篇文章时考虑了您的函数返回的字符串的特定形式,其中假定 k 是要输入的 'kth' 变量的索引。 Array var 可以是数字参数的列表。

file=@(var,i)[strcat('var',num2str(i),'=') num2str(var) ];

var=[2,3,4,5];

str='';

for i=1:length(var);

str=strcat(str,file(var(i),i));

end

为此使用 fprintf with varargin

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 实际上在官方文档中警告您!