필터 지우기
필터 지우기

How to support default parameter in MATLAB FUNCTION ?

조회 수: 1,426 (최근 30일)
M.K.H. CHANDAN
M.K.H. CHANDAN 2015년 5월 18일
편집: Nicholas Ayres 2023년 6월 22일
1 . As I know , there is no default parameter support on MATLAB FUNCTION like other high level programming language c,c++, Is there any other methodology through which it can be done like other compiler C,C++? or programmer has to do using his own logic through varargin.

채택된 답변

Stephen23
Stephen23 2015년 5월 18일
편집: Stephen23 2015년 5월 18일
MATLAB is an interpreted language, not a compiled language, so there is no compiler as such.
In any case there is no inbuilt syntax to allow such things as:
function out = fun(val_1=def_val, val_2=def_val2, ...)
But you could use the input parser class, or use one of the methods listed here:
The most common ways of dealing with this are:
  • Use nargin and some switch or if statements to detemrine the default parameters.
  • Use varargin and logical indexing to detect non-specified arguments (e.g. empty).
  • Use key-value pairs (usually with varargin) and strcmpi to detect the keys.
  • Use a scalar structure to hold all options.
Using varargin with nargin or logical indexing is very easy:
function foobar(varargin)
Defaults = {A,B,C...};
Defaults(1:nargin) = varargin;
OR
function foobar(varargin)
Defaults = {A,B,C...};
idx = ~cellfun('isempty',varargin);
Defaults(idx) = varargin(idx);
MATLAB themselves use different methods in different functions. Have a look at the ODE functions to see the structure syntax, many plotting functions use the key-value syntax.
You can easily combine key-value and scalar-structure in one function, see my FEX submission here to see how:
  댓글 수: 6
Tong Zhao
Tong Zhao 2022년 6월 16일
Thanks from 2022

댓글을 달려면 로그인하십시오.

추가 답변 (5개)

Jan Siegmund
Jan Siegmund 2020년 7월 4일
편집: Jan Siegmund 2020년 7월 8일
The Answers are not up to date. Modern MATLAB supports the arguments Block:
function out = foo(in)
arguments
in(1,1) double {mustBeFinite} = 0;
end
out = in + 1;
end
Be careful with the validation functions though. They are not "is"-functions returning logical, rather they throw an error. Here is a list of predefined ones: https://de.mathworks.com/help/matlab/matlab_prog/argument-validation-functions.html
If the default argument is a class you may want to use <Class>.empty:
arguments
nameValueArgs.BaseFigure matlab.ui.Figure = matlab.ui.Figure.empty;
end
  댓글 수: 2
Stephen23
Stephen23 2020년 7월 4일
Note that the arguments syntax was first introduced in R2019b.
Jan Siegmund
Jan Siegmund 2020년 7월 4일
Ah thank you Stephen, I thought it would have existed for longer.

댓글을 달려면 로그인하십시오.


Stefan Schuberth
Stefan Schuberth 2023년 1월 23일
편집: Stefan Schuberth 2023년 1월 23일
function testFun(a,b)
arguments a=10; end % default value
arguments b(3,3) double {mustBePositive} = 10; end
% arguments a(size1dim,size2dim) varType {validationFunction} = defaultValue; end
disp(a);
end

Ingrid
Ingrid 2015년 5월 18일
in your function you need to check how many parameters have been passed
function myFunction(variable1,variable2, optionalVarChangeDefaultParam)
if nargin > 2
defaultParam = optionalVarChangeDefaultParam;
else
defaultParam = 2;
end
  댓글 수: 1
M.K.H. CHANDAN
M.K.H. CHANDAN 2015년 5월 18일
편집: M.K.H. CHANDAN 2015년 11월 19일
Yes , It is programmer way , but MATLAB does not support like function myFunction(variable1,variable2,... optionalVarChangeDefaultParam1 =3, ... optionalVarChangeDefaultParam2 =4 , ... optionalVarChangeDefaultParam4 =5)

댓글을 달려면 로그인하십시오.


shmuel katz
shmuel katz 2023년 6월 8일
편집: shmuel katz 2023년 6월 8일
I don't know if it helps, but if you know the name of the variables you enter, you can try the following:
function myFunction(var1,var2,var3,var4,...)
defaults.var1 = 1;
defaults.var2 = 2;
defaults.var3 = 3;
defaults.var4 = 4;
defaultNames = fieldnames(defaults);
for nInputName = 1:numel(defaultNames)
variableName = defaultNames{nInputName};
if ~exist(variableName,'var')
eval([variableName,'=','defaults.(variableName);']);
end
end
...
...
...
end
  댓글 수: 2
Nicholas Ayres
Nicholas Ayres 2023년 6월 8일
Hi.
I would say that this other comment is strictly better:
Argument blocks allow you even to set default values for name-value pairs (do not need to be positional at all).
Although if you WERE to take a non-argumentbloack approach (argument blocks are only a relatively recent addition), personally, I would use nargin, rather than checking if things exist.
If nargin == 2, you know vars 3+ do not exist.
Something like this may suffice.
function myFunction(var1, var2, var3, var4, ...)
if nargin < 1
var1 = 1;
end
if nargin < 2
var2 = 2;
end
if nargin < 3
var3 = 3;
end
...
...
end
Also, there is no reason to use eval here. Eval is slow and unsafe. There is no good reason here to dynamically create variables.
This is your function. You have set defaults. This means that these variables are always needed and you have not the need to automate this code section. It just hurts everybody.
Varargin is also useful, but make sure you know why you're using it.
shmuel katz
shmuel katz 2023년 6월 8일
You are right, but sometimes you need a more readable and concise code. If you have 10 variables for one function it is a very cumbersome solution. This said for the Old MATLAB, the new ones have the argument choice (but you need to keep the order)

댓글을 달려면 로그인하십시오.


Captain Karnage
Captain Karnage 2023년 6월 21일
Yet another update. As of R2021a, MATLAB supports name/value arguments using either the old, quoted name, value list syntax or name = value syntax. https://www.mathworks.com/help/matlab/matlab_prog/validate-name-value-arguments.html
  댓글 수: 1
Nicholas Ayres
Nicholas Ayres 2023년 6월 22일
편집: Nicholas Ayres 2023년 6월 22일
While this is fun information, it is just syntactic sugar. I don't believe it is relevant to the actual question here, which is about default parameters. Would probably do better as a comment on someone else's answer, rather than its own.
(although the link you have provided and not actually discussed is very on-topic)

댓글을 달려면 로그인하십시오.

카테고리

Help CenterFile Exchange에서 Workspace Variables and MAT-Files에 대해 자세히 알아보기

제품

Community Treasure Hunt

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

Start Hunting!

Translated by