É possível ter argumentos padrão no Matlab? Por exemplo, aqui:
function wave(a, b, n, k, T, f, flag, fTrue=inline('0'))
Eu gostaria que a solução verdadeira fosse um argumento opcional para a função de onda. Se for possível, alguém pode demonstrar a maneira correta de fazer isso? Atualmente, estou tentando o que postei acima e recebo:
??? 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.
if nargin
estatemens), fácil de manter, compacto e flexível.Outra maneira um pouco menos hacky é
fonte
Sim, pode ser muito bom ter a capacidade de fazer o que você escreveu. Mas isso não é possível no MATLAB. Muitos dos meus utilitários que permitem padrões para os argumentos tendem a ser escritos com verificações explícitas no início, assim:
Ok, então eu geralmente aplicaria uma mensagem de erro melhor e mais descritiva. Veja que a verificação de uma variável vazia permite que o usuário passe um par de colchetes vazios, [], como um espaço reservado para uma variável que assumirá seu valor padrão. O autor ainda deve fornecer o código para substituir esse argumento vazio por seu valor padrão.
Meus utilitários mais sofisticados, com MUITOS parâmetros, todos com argumentos padrão, geralmente usam uma interface de par de propriedade / valor para argumentos padrão. Esse paradigma básico é visto nas ferramentas gráficas de manipulação no matlab, assim como no optimset, odeset, etc.
Como forma de trabalhar com esses pares de propriedade / valor, você precisará aprender sobre o varargin, como uma maneira de inserir um número totalmente variável de argumentos em uma função. Escrevi (e publiquei) um utilitário para trabalhar com esses pares de propriedade / valor, parse_pv_pairs.m . Ele ajuda a converter pares de propriedade / valor em uma estrutura do matlab. Ele também permite que você forneça valores padrão para cada parâmetro. Converter uma lista difícil de parâmetros em uma estrutura é uma maneira MUITO legal de distribuí-los no MATLAB.
fonte
Esta é a minha maneira simples de definir valores padrão para uma função, usando "try":
Saudações!
fonte
Descobri que a função parseArgs pode ser muito útil.
fonte
Também existe um 'hack' que pode ser usado, embora possa ser removido do matlab em algum momento: A função eval realmente aceita dois argumentos, dos quais o segundo é executado se ocorrer um erro no primeiro.
Assim, podemos usar
usar o valor 1 como padrão para o argumento
fonte
Acredito que encontrei uma maneira bacana de lidar com esse problema, ocupando apenas três linhas de código (barramento de linhas). O seguinte é retirado diretamente de uma função que estou escrevendo e parece funcionar como desejado:
Só pensei em compartilhar.
fonte
Estou confuso que ninguém apontou este post de Loren, um dos desenvolvedores do Matlab. A abordagem é baseada
varargin
e evita todos aqueles casos intermináveis e dolorososif-then-else
ouswitch
com condições complicadas. Quando existem alguns valores padrão, o efeito é dramático . Aqui está um exemplo do blog vinculado:Se você ainda não entendeu, tente ler toda a postagem de Loren. Eu escrevi uma postagem de blog de acompanhamento que lida com a falta de valores padrão posicionais. Quero dizer que você poderia escrever algo como:
e ainda tem o
eps
valor padrão para otol
parâmetro (e@magic
retorno de chamada, éfunc
claro). O código de Loren permite isso com uma modificação leve, porém complicada.Por fim, apenas algumas vantagens dessa abordagem:
if-then-else
abordagens, que fica mais longa a cada novo valor padrão)Trooth seja informado, também há uma desvantagem. Quando você digita a função no shell do Matlab e esquece seus parâmetros, verá uma
varargin
dica inútil . Para lidar com isso, é recomendável escrever uma cláusula de uso significativa.fonte
Depois de tomar conhecimento de ASSIGNIN (graças a esta resposta de b3 ) e EVALIN , escrevi duas funções para finalmente obter uma estrutura de chamada muito simples:
Aqui está a lista:
e
fonte
Isso é mais ou menos retirado do manual do Matlab ; Eu só tenho experiência de passar ...
fonte
O Matlab não fornece um mecanismo para isso, mas você pode construir um no código da terra do usuário que é mais tenso do que as seqüências inputParser ou "if nargin <1 ...".
Então você pode chamá-lo em suas funções como esta:
A formatação é uma convenção que permite a leitura de nomes de parâmetros para seus valores padrão. Você pode estender seu getargs () com especificações opcionais de tipo de parâmetro (para detecção de erros ou conversão implícita) e intervalos de contagem de argumentos.
Existem duas desvantagens nessa abordagem. Primeiro, é lento, então você não deseja usá-lo para funções chamadas em loops. Segundo, a ajuda das funções do Matlab - as dicas de preenchimento automático na linha de comando - não funcionam para funções varargin. Mas é bastante conveniente.
fonte
você pode querer usar o
parseparams
comando no matlab; o uso seria semelhante a:fonte
por exemplo,
f(2,4,'c',3)
faz com que o parâmetroc
seja 3.fonte
se você usasse a oitava, poderia fazê-lo assim - mas, infelizmente, o matlab não suporta essa possibilidade
(retirado do documento )
fonte
Eu gosto de fazer isso de uma maneira um pouco mais orientada a objetos. Antes de chamar wave (), salve alguns argumentos dentro de uma estrutura, por exemplo. um chamado parâmetros:
Dentro da função wave, verifique se os parâmetros struct contêm um campo chamado 'flag' e, se houver, se o valor não está vazio. Em seguida, atribua a ele um valor padrão definido anteriormente, ou o valor fornecido como argumento na estrutura de parâmetros:
Isso facilita o manuseio de um grande número de argumentos, porque não depende da ordem dos argumentos fornecidos. Dito isto, também é útil se você precisar adicionar mais argumentos posteriormente, porque não precisará alterar a assinatura das funções para fazer isso.
fonte
wave(a,b,'flag',42,'fTrue',1)