声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2530|回复: 8

[编程技巧] nargin、nargout等不确定变量的使用问题

[复制链接]
发表于 2015-10-12 21:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
nargin、nargout、nargchk、varargin、varargout等不确定变量在编程中该如何使用?
回复
分享到:

使用道具 举报

发表于 2015-10-14 10:52 | 显示全部楼层
这些帮助文件中都有,doc相应的变量名就能看到
 楼主| 发表于 2015-10-14 11:18 | 显示全部楼层
happy 发表于 2015-10-14 10:52
这些帮助文件中都有,doc相应的变量名就能看到

英语不好,有中文的说明吗?
发表于 2015-10-16 08:14 | 显示全部楼层
Matlab中nargin介绍
nargin为“number of input arguments”的缩写。
功能: 在matlab中定义一个函数时, 在函数体内部, nargin是用来判断输入变量个数的函数。 特别是在利用了可变参数列表的函数中, 用nargin获取输入参数个数很方便。在matlab命令窗口中输入doc nargin或者help nargin即可获得该函数的帮助信息。

例1.函数文件 examp.m
  1. function fout=examp(a,b,c)
  2. if nargin==1
  3. fout=a;
  4. else if nargin==2
  5. fout=a+b;
  6. else if nargin==3
  7. fout=(a*b*c)/2;
  8. end
  9. end
  10. end
复制代码

例2.function名为myplot。
  1. function [x0, y0] = myplot(x, y, npts, angle, subdiv)
  2.   % MYPLOTPlot a function.
  3.   % MYPLOT(x, y, npts, angle, subdiv)
  4.   %The first two input arguments are
  5.   %required; the other three have default values...
  6.   ifnargin< 5, subdiv = 20; end
  7.   ifnargin< 4, angle = 10; end
  8.   ifnargin< 3, npts = 25; end
  9.   ...
  10.   if nargout == 0
  11.   plot(x, y)
  12.   else
  13.   x0 = x;
  14.   y0 = y;
  15.   end
  16. 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.
  1. function foo(argA, argB, argC, varargin)
  2. fprintf('How many input arguments? %d\n', nargin);
  3. fprintf('The input arguments are: %d %d %d ', argA, argB, argC);
  4. for k=1:size(varargin, 2)
  5. disp(varargin{k})
  6. end
  7. disp('Done');
  8. end
  9. 输出结果
  10. >> foo(1, 2, 3)
  11. How many input arguments? 3
  12. The input arguments are: 1 2 3 Done
  13. >> foo(1, 2, 3, [4, 5, 6])
  14. How many input arguments? 4
  15. The input arguments are: 1 2 3 4 5 6
  16. Done
复制代码
发表于 2015-10-16 08:15 | 显示全部楼层
Matlab中nargout介绍
功能: 在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。 特别是在利用了可变参数列表的函数中, 用nargout获取输入参数个数很方便。
语法:
nargout
nargout(fun)
相关:varargout、nargin、varargin
应用举例
  1. function varargout = foo(varargin)
  2. fprintf('How many output arguments? %d\n', nargout);
  3. for k=1:nargout
  4. varargout(k) = {varargin{k}};
  5. end
  6. end
复制代码

输出结果
>> ret = foo(1, 2, 3)
How many output arguments? 1
ret = 1
>> [retA, retB] = foo(1, 2, 3)
How many output arguments? 2
retA = 1
retB = 2
>> [retA, retB, retC] = foo(1, 2, 3)
How many output arguments? 3
retA = 1
retB = 2
retC = 3
发表于 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'
构体或空矩阵),否则返回错误。
发表于 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文档)
  1. function retvar = vartest(varargin)
  2. optargin = size(varargin, 2); % number of inputs.
  3. ndims(varargin)
  4. varargin
  5. stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
  6. fprintf('Number of inputs: %d\n', nargin);
  7. fprintf('Inputs from individual arguments: %d\n', stdargin)
  8. for k = 1:size(varargin, 2)
  9. fprintf('%d: %d\n', k, varargin{k});
  10. end
  11. end
复制代码

这里定义了一个函数, 利用了可变参数列表。然后我们这样调用这个函数:
>> vartest(1, 2, 3)
ans = 2
varargin =
[1] [2] [3]
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)吗?
对于本例,的确这样子。
但是有的函数, 参数列表是这样的:
  1. function vartest_2(arg1, argb, varargin)
  2. optargin = size(varargin, 2); % number of inputs.
  3. stdargin = nargin - optargin; % 'nargin' in matlab means number of input arguments.
  4. fprintf('Number of inputs: %d\n', nargin);
  5. fprintf('Inputs from individual arguments: %d\n', stdargin)
  6. for k = 1:size(varargin, 2)
  7. fprintf('%d: %d\n', k, varargin{k});
  8. end
  9. 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。
发表于 2015-10-16 08:17 | 显示全部楼层

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

在matlab中定义一个函数时, 在函数体内部, nargout指出了输出参数的个数(nargin指出了输入参数的个数)。
调用及输出结果:
>> ret = foo(1, 2, 3);
How many output arguments? 1
And they are:
1
>> [retA, retB] = foo(1, 2, 3);
How many output arguments? 2
And they are:
1 2
>> [retA, retB, retC] = foo(1, 2, 3);
How many output arguments? 3
And they are:
1 2 3
 楼主| 发表于 2015-10-18 09:11 | 显示全部楼层
好详细啊,非常感谢
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 11:12 , Processed in 0.073811 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表