创建一个输入数量可变的函数?
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
然后它看起来不可能。但是,如果您不介意在字符串中包含 var1
、var2
,则可以定义此函数然后使用它:
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
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 实际上在官方文档中警告您!
我正在尝试在 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
然后它看起来不可能。但是,如果您不介意在字符串中包含 var1
、var2
,则可以定义此函数然后使用它:
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
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 实际上在官方文档中警告您!