xlnput1-3.ll安装了还是不可以快玩游戏盒安装

Default Arguments in Matlab - Stack Overflow
Join the Stack Overflow Community
Stack Overflow is a community of 6.9 million programmers, just like you, helping each other.
J it only takes a minute:
Is it possible to have default arguments in Matlab?
For instance, here:
function wave(a,b,n,k,T,f,flag,fTrue=inline('0'))
I would like to have the true solution be an optional argument to the wave function.
If it is possible, can anyone demonstrate the proper way to do this?
Currently, I am trying what I posted above and I get:
??? Error: File: wave.m Line: 1 Column: 37
The expression to the left of the equals sign is not a valid target for an assignment.
As far as I know, there isn't a direct way to do this like you've attempted.
The usual approach is to use varargs and check against the number of args.
Something like:
function f(arg1,arg2,arg3)
if nargin & 3
'some default'
There are a few fancier things you can do with isempty, etc., and you might want to look at matlab central for some packages that bundle these sorts of things.
glad that helped.
you might have a look at varargin,
nargchk, etc. they're useful functions for this sort of thing.
varargs allow you to leave a variable number of final arguments, but this doesn't get you around the problem of default values for some/all of them.
6,39812126
I've used the
object to deal with setting default options. Matlab won't accept the python-like format you specified in the question, but you should be able to call the function like this:
wave(a,b,n,k,T,f,flag,'fTrue',inline('0'))
After you define the wave function like this:
function wave(a,b,n,k,T,f,flag,varargin)
i_p = inputP
i_p.FunctionName = 'WAVE';
i_p.addRequired('a',@isnumeric);
i_p.addRequired('b',@isnumeric);
i_p.addRequired('n',@isnumeric);
i_p.addRequired('k',@isnumeric);
i_p.addRequired('T',@isnumeric);
i_p.addRequired('f',@isnumeric);
i_p.addRequired('flag',@isnumeric);
i_p.addOptional('ftrue',inline('0'),1);
i_p.parse(a,b,n,k,T,f,flag,varargin{:});
Now the values passed into the function are available through i_p.Results. Also, I wasn't sure how to validate that the parameter passed in for ftrue was actually an inline function so left the validator blank.
53.1k1892172
Another slightly less hacky way is
function output = fun(input)
if ~exist('input','var'), input='BlahBlahBlah'; end
Yes, it might be really nice to have the capability to do as you have written. But it is not possible in MATLAB. Many of my utilities that allow defaults for the arguments tend to be written with explicit checks in the beginning like this:
if (nargin&3) or isempty(myParameterName)
MyParameterName = defaultV
elseif (.... tests for non-validity of the value actually provided ...)
error('The sky is falling!')
Ok, so I would generally apply a better, more descriptive error message. See that the check for an empty variable allows the user to pass in an empty pair of brackets, [], as a placeholder for a variable that will take on its default value. The author must still supply the code to replace that empty argument with its default value though.
My utilities that are more sophisticated, with MANY parameters, all of which have default arguments, will often use a property/value pair interface for default arguments. This basic paradigm is seen in the handle graphics tools in matlab, as well as in optimset, odeset, etc.
As a means to work with these property/value pairs, you will need to learn about varargin, as a way of inputing a fully variable number of arguments to a function. I wrote (and posted) a utility to work with such property/value pairs, . It helps you to convert property/value pairs into a matlab structure. It also enables you to supply default values for each parameter. Converting an unwieldy list of parameters into a structure is a VERY nice way to pass them around in MATLAB.
I've found that the
function can be very helpful.
45.1k35186
There is also a 'hack' that can be used although it might be removed from matlab at some point:
Function eval actually accepts two arguments of which the second is run if an error occurred with the first.
Thus we can use
function output = fun(input)
eval('', 'input = 1;');
to use value 1 as default for the argument
This is my simple way to set default values to a function, using "try":
function z = myfun (a,varargin)
%% Default values
b = varargin{1};
c = varargin{2};
d = varargin{3};
e = varargin{4};
%% Calculation
z = a * b * c * d *
After becoming aware of
(thanks to
I wrote two functions to finally obtain a very simple calling structure:
setParameterDefault('fTrue', inline('0'));
Here's the listing:
function setParameterDefault(pname, defval)
% setParameterDefault(pname, defval)
% Author: Tobias Kienzler (/users/321973)
% sets the parameter NAMED pname to the value defval if it is undefined or
if ~isParameterDefined('pname')
error('paramDef:noPname', 'No parameter name defined!');
elseif ~isvarname(pname)
error('paramDef:pnameNotChar', 'pname is not a valid varname!');
elseif ~isParameterDefined('defval')
error('paramDef:noDefval', ['No default value for ' pname ' defined!']);
% isParameterNotDefined copy&pasted since evalin can't handle caller's
% caller...
if ~evalin('caller',
['exist(''' pname ''', ''var'') && ~isempty(' pname ')'])
callername = evalin('caller', 'mfilename');
warnMsg = ['Setting ' pname ' to default value'];
if isscalar(defval) || ischar(defval) || isvector(defval)
warnMsg = [warnMsg ' (' num2str(defval) ')'];
warnMsg = [warnMsg '!'];
warning([callername ':paramDef:assigning'], warnMsg);
assignin('caller', pname, defval);
function b = isParameterDefined(pname)
% b = isParameterDefined(pname)
% Author: Tobias Kienzler (/users/321973)
% returns true if a parameter NAMED pname exists in the caller's workspace
% and if it is not empty
b = evalin('caller',
['exist(''' pname ''', ''var'') && ~isempty(' pname ')']) ;
7,8021162121
I believe I found quite a nifty way to deal with this issue, taking up only three lines of code (barring line wraps). The following is lifted directly from a function I am writing, and it seems to work as desired:
defaults = {50/6,3,true,false,[375,20,50,0]}; %set all defaults
defaults(1:nargin-numberForcedParameters) = %overload with function input
[sigma,shifts,applyDifference,loop,weights] = ...
defaults{:}; %unfold the cell struct
Just thought I'd share it.
This is more or l I've only got passing experience...
function my_output = wave ( a, b, n, k, T, f, flag, varargin )
optargin = numel(varargin);
fTrue = inline('0');
if optargin & 0
fTrue = varargin{1};
% code ...
92.7k11207292
Matlab doesn't provide a mechanism for this, but you can construct one in userland code that's terser than inputParser or "if nargin & 1..." sequences.
function varargout = getargs(args, defaults)
%GETARGS Parse function arguments, with defaults
% args is varargin from the caller. By convention, a [] means "use default".
% defaults (optional) is a cell vector of corresponding default values
if nargin & 2;
defaults = {}; end
varargout = cell(1, nargout);
for i = 1:nargout
if numel(args) &= i && ~isequal(args{i}, [])
varargout{i} = args{i};
elseif numel(defaults) &= i
varargout{i} = defaults{i};
Then you can call it in your functions like this:
function y = foo(varargin)
% y = foo(a, b, c, d, e, f, g)
d, e, f, g] = getargs(varargin,...
{1, 14, 'dfltc'});
The formatting is a convention that lets you read down from parameter names to their default values. You can extend your getargs() with optional parameter type specifications (for error detection or implicit conversion) and argument count ranges.
There are two drawbacks to this approach. First, it's slow, so you don't want to use it for functions that are called in loops. Second, Matlab's function help - the autocompletion hints on the command line - don't work for varargin functions. But it is pretty convenient.
16.4k33363
I am confused nobody has pointed out
by Loren, one of Matlab's developers. The approach is based on varargin and avoids all those endless and painfull if-then-else or switch cases with convoluted conditions. When there are a few default values, the effect is dramatic. Here's an example from the linked blog:
function y = somefun2Alt(a,b,varargin)
% Some function that requires 2 inputs and has some optional inputs.
% only want 3 optional inputs at most
numvarargs = length(varargin);
if numvarargs & 3
error('myfuns:somefun2Alt:TooManyInputs', ...
'requires at most 3 optional inputs');
% set defaults for optional inputs
optargs = {eps 17 @magic};
% now put these defaults into the valuesToUse cell array,
% and overwrite the ones specified in varargin.
optargs(1:numvarargs) =
% [optargs{1:numvarargs}] = varargin{:};
% Place optional args in memorable variable names
[tol, mynum, func] = optargs{:};
If you still don't get it, then try reading the entire blog post by Loren. I have written a follow up
which deals with missing positional default values. I mean that you could write something like:
somefun2Alt(a, b, '', 42)
and still have the default eps value for the tol parameter (and @magic callback for func of course). Loren's code allows this with a slight but tricky modification.
Finally, just a few advantages of this approach:
Even with a lot of defaults the boilerplate code doesn't get huge (as opposed to the family of if-then-else approaches, which get longer with each new default value)
All the defaults are in one place. If any of those need to change, you have just one place to look at.
Trooth be told, there is a disadvantage too. When you type the function in Matlab shell and forget its parameters, you will see an unhelpful varargin as a hint. To deal with that, you're advised to write a meaningful usage clause.
you might want to use the parseparams the usage would look like:
function output = wave(varargin);
% comments, etc
[reg, props] = parseparams(varargin);
ctrls = cell2struct(props(2:2:end),props(1:2:end),2);
%yes this is ugly!
a = reg{1};
b = reg{2};
fTrue = ctrl.fT
1,16331119
function f(arg1, arg2, varargin)
arg3 = default3;
arg4 = default4;
for ii = 1:length(varargin)/2
if ~exist(varargin{2*ii-1})
error(['unknown parameter: ' varargin{2*ii-1}]);
eval([varargin{2*ii-1} '=' varargin{2*ii}]);
e.g. f(2,4,'c',3) causes the parameter c to be 3.
7,8021162121
if you would use octave you could do it like this - but sadly matlab does not support this possibility
function hello (who = "World")
printf ("Hello, %s!\n", who);
endfunction
(taken from the )
Your Answer
Sign up or
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Post as a guest
By posting your answer, you agree to the
Not the answer you're looking for?
Browse other questions tagged
The week's top questions and answers
Important community announcements
Questions that need answers
By subscribing, you agree to the
rev .25579
Stack Overflow works best with JavaScript enabled

我要回帖

更多关于 拇指玩游戏安装 的文章

 

随机推荐