tangwx 发表于 2015-10-12 21:32

nargin、nargout等不确定变量的使用问题

nargin、nargout、nargchk、varargin、varargout等不确定变量在编程中该如何使用?

happy 发表于 2015-10-14 10:52

这些帮助文件中都有,doc相应的变量名就能看到

tangwx 发表于 2015-10-14 11:18

happy 发表于 2015-10-14 10:52
这些帮助文件中都有,doc相应的变量名就能看到

英语不好,有中文的说明吗?

happy 发表于 2015-10-16 08:14

Matlab中nargin介绍
nargin为“number of input arguments”的缩写。
功能: 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数。 特别是在利用了可变参数列表的函数中, 用nargin获取输入参数个数很方便。在matlab命令窗口中输入doc nargin或者help nargin即可获得该函数的帮助信息。

例1.函数文件 examp.m
function fout=examp(a,b,c)
if nargin==1
fout=a;
else if nargin==2
fout=a+b;
else if nargin==3
fout=(a*b*c)/2;
end
end
end
例2.function名为myplot。
function = myplot(x, y, npts, angle, subdiv)
  % MYPLOTPlot a function.
  % MYPLOT(x, y, npts, angle, subdiv)
  %The first two input arguments are
  %required; the other three have default values...
  ifnargin< 5, subdiv = 20; end
  ifnargin< 4, angle = 10; end
  ifnargin< 3, npts = 25; end
  ...
  if nargout == 0
  plot(x, y)
  else
  x0 = x;
  y0 = y;
  end
end
注:%x,y是两个变量,npt,angle,subdiv这三个参数具有默认值,不需要输入。
  if nargin < 5, subdiv = 20; end如果输入变量的个数小于5个,那么给subdiv赋默认值。
if nargin < 4, angle = 10; end如果输入变量的个数小于4个,那么给angle赋默认值。
详细用法 在matlab窗口中输入 help nargin
例3.
function foo(argA, argB, argC, varargin)
fprintf('How many input arguments? %d\n', nargin);
fprintf('The input arguments are: %d %d %d ', argA, argB, argC);
for k=1:size(varargin, 2)
disp(varargin{k})
end
disp('Done');
end
输出结果
>> foo(1, 2, 3)
How many input arguments? 3
The input arguments are: 1 2 3 Done
>> foo(1, 2, 3, )
How many input arguments? 4
The input arguments are: 1 2 3 4 5 6
Done

happy 发表于 2015-10-16 08:15

Matlab中nargout介绍
功能: 在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。 特别是在利用了可变参数列表的函数中, 用nargout获取输入参数个数很方便。
语法:
nargout
nargout(fun)
相关:varargout、nargin、varargin
应用举例
function varargout = foo(varargin)
fprintf('How many output arguments? %d\n', nargout);
for k=1:nargout
varargout(k) = {varargin{k}};
end
end
输出结果
>> ret = foo(1, 2, 3)
How many output arguments? 1
ret = 1
>> = foo(1, 2, 3)
How many output arguments? 2
retA = 1
retB = 2
>> = foo(1, 2, 3)
How many output arguments? 3
retA = 1
retB = 2
retC = 3

happy 发表于 2015-10-16 08:16

nargchk函数
功能说明
验证输入参数的个数

函数语法
msgstring = nargchk(minargs, maxargs, numargs)
msgstring = nargchk(minargs, maxargs, numargs, 'string')
msgstruct = nargchk(minargs, maxargs, numargs, 'struct')

参数解析
在函数中使用nargchk来检查输入参数的个数在期望的范围内.

msgstring = nargchk(minargs, maxargs, numargs)
如果输入参数numargs所指定的个数比minargs小,比maxargs大,返回错误;

msgstring = nargchk(minargs, maxargs, numargs, 'string')
和上面用法相同,只是会返回string而不是默认的值;

msgstruct = nargchk(minargs, maxargs, numargs, 'struct')
返回一个结构体,而不是字符串,结构体的域包含错误的信息和信息标识符.
当输入参数个数过少,返回:
message: 'Not enough input arguments.'
identifier: 'MATLAB:nargchk:notEnoughInputs'
当输入参数个数过多,返回:
message: 'Too many input arguments.
identifier: 'MATLAB:nargchk:tooManyInputs'
构体或空矩阵),否则返回错误。

happy 发表于 2015-10-16 08:17

matlab中varargin简介
varargin可以看做“Variable length input argument list”的缩写。在matlab中, varargin提供了一种函数可变参数列表机制。 就是说, 使用了“可变参数列表机制”的函数允许调用者调用该函数时根据需要来改变输入参数的个数。
matlab中很多内建函数和工具箱函数都使用了这种机制。 比如图像处理工具箱中的imshow函数。 该函数允许我们根据图像数据特点来调用:
比如, 显示一张真彩色位图, 我们可以简单的使用:
imshow(RGB), 其中RGB是通过imread函数读取图像获得的图像数据。这里我们只给了一个参数。
但是在显示索引图像时, 因为索引图像使用了调色板,因此为了正确显示图像, 除了图像数据外, 我们还要额外指定显示图像所使用的调色板(一般也由imread函数获得),这样就出现了以下的调用格式:
imshow(X, map)
那么, 这种机制是怎么实现的呢? 借助于varargin。
相关:varargout、nargin
下面我们来看一个简单的例子,(本例子参考了matlab中varargin文档)
function retvar = vartest(varargin)
optargin = size(varargin, 2); % number of inputs.
ndims(varargin)
varargin
stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
fprintf('Number of inputs: %d\n', nargin);
fprintf('Inputs from individual arguments: %d\n', stdargin)
for k = 1:size(varargin, 2)
fprintf('%d: %d\n', k, varargin{k});
end
end
这里定义了一个函数, 利用了可变参数列表。然后我们这样调用这个函数:
>> vartest(1, 2, 3)
ans = 2
varargin =

Number of inputs: 3
Inputs from individual arguments: 0
1: 1
2: 2
3: 3
我们看到, 这里varargin是一个1*3的二维矩阵, 这个矩阵即我们调用这个函数时传入的参数列表。
通过size(varargin, 2)获得的varargin第二维的尺寸(即varargin的列数)就是我们传入的参数个数。
stdargin = nargin - optargin;这一句是获取可变参数列表从第几个参数开始的。 其中, nargin也是matlab中的, 不能拼错了, nargin的
值即传入的所有参数个数。
也许你会问, 咦? 这不就是size(varargin, 2)吗?
对于本例,的确这样子。
但是有的函数, 参数列表是这样的:
function vartest_2(arg1, argb, varargin)
optargin = size(varargin, 2); % number of inputs.
stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
fprintf('Number of inputs: %d\n', nargin);
fprintf('Inputs from individual arguments: %d\n', stdargin)
for k = 1:size(varargin, 2)
fprintf('%d: %d\n', k, varargin{k});
end
end
这次我们调用:
>> vartest_2(1, 2, 3)
Number of inputs: 3
Inputs from individual arguments: 2
1: 3
你会看到, 由于vartest_2的第一二个参数不是可变参数列表的一部分, 可变参数列表从第三个参数开始。因此
nargin等于3, 而size(varargin, 2) 等于1。

happy 发表于 2015-10-16 08:17


matlab中varargout简介
varargout可以看做“Variable length output argument list”的缩写。在matlab中定义m函数时通过varargout我们可以得到可变个数个返回值。在matlab命令窗口中输入doc varargout或help varargout可以获得相关帮助信息。
相关:varargin、nargin、nargout
下面我们来看一个简单的例子
function varargout = foo(varargin)
fprintf('How many output arguments? %d\nAnd they are: \n', nargout);
for k=1:nargout
varargout(k) = varargin(k); % the same as {varargin{k}};
fprintf('%s ', num2str(varargout{k}));
end
disp(' ');
end
在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。
调用及输出结果:
>> ret = foo(1, 2, 3);
How many output arguments? 1
And they are:
1
>> = foo(1, 2, 3);
How many output arguments? 2
And they are:
1 2
>> = foo(1, 2, 3);
How many output arguments? 3
And they are:
1 2 3

tangwx 发表于 2015-10-18 09:11

好详细啊,非常感谢
页: [1]
查看完整版本: nargin、nargout等不确定变量的使用问题