nargin of optional arugments

4 次查看(过去 30 天)
function func(arg1,options)
arguments
arg1 = 1
options.arg2 = 2
options.arg3 = 3
end
disp(nargin)
end
%%
func(1,arg2=3,arg3=5)
1
The function "func" has 3 input arguments, why nargin is 1? And how to get the number of all input arguments, including optional ones?
  2 个评论
Noé
Noé 2025-2-11
Hi Wang,
As mentioned in https://mathworks.com/help/releases/R2024a/matlab/matlab_prog/nargin-in-argument-validation.html "The value that nargin returns does not include optional input arguments that are not included in the function call. Also, nargin does not count any name-value arguments."
Here arg2 and arg3 are optional arguments whereas arg1 is positional argument.
If you want to know how many arguments have been passed you can:
"Use nargin to determine if optional positional arguments are passed to the function when called. For example, this function declares three positional arguments and a name-value argument. Here is how the function determines what arguments are passed when it is called.
  • nargin determines if the optional positional argument c is passed to the function with a switch block.
  • isfield determines if the name-value argument for Format is passed to the function."
Catalytic
Catalytic 2025-2-11
编辑:Catalytic 2025-2-11
Also, nargin does not count any name-value arguments
I find this a bit of an unsettling design choice. Why not create a new command with this behaviour rather than change the behaviour of old ones?

请先登录,再进行评论。

采纳的回答

Catalytic
Catalytic 2025-2-11
编辑:Catalytic 2025-2-11
func(1,arg2=3,arg3=5)
NUM_ARGSIN = 3
options = struct with fields:
arg2: 3 arg3: 5
function func(arg1,names,values)
arguments
arg1 = 1
end
arguments (Repeating)
names string
values double
end
NUM_ARGSIN = numel(names)+1
nvp=[names;values];
options=struct(nvp{:})
end
  2 个评论
Matt J
Matt J 2025-2-11
编辑:Matt J 2025-2-11
If you're going to look at it that way, I think it should be,
func()
NUM_ARGSIN = 0
func(10)
NUM_ARGSIN = 1
func(1,arg2=3,arg3=5)
NUM_ARGSIN = 3
function func(arg1,names,values)
arguments
arg1 = 1
end
arguments (Repeating)
names string
values double
end
NUM_ARGSIN = nargin - numel(names)
nvp=[names;values];
options=struct(nvp{:});
end

请先登录,再进行评论。

更多回答(1 个)

Matt J
Matt J 2025-2-11
编辑:Matt J 2025-2-11
The function "func" has 3 input arguments, why nargin is 1?
There are 5 input arguments, not 3:
func(1,arg2=3,arg3=5)
NUM_ARGSIN = 5
arg1 = 1
options = struct with fields:
arg2: 3 arg3: 5
function func(varargin)
NUM_ARGSIN = nargin
[arg1,options]=doValidations(varargin{:});
disp ' ', arg1, options
end
function [arg1,options]=doValidations(arg1,options)
arguments
arg1 = 1
options.arg2 = 2
options.arg3 = 3
end
end

类别

Help CenterFile Exchange 中查找有关 Variables 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by