É possível obter o 'nésimo' valor de retorno de uma função sem precisar criar variáveis fictícias para todos os n-1
valores de retorno anteriores a ela?
Digamos, eu tenho a seguinte função no MATLAB:
function [a,b,c,d] = func()
a = 1;
b = 2;
c = 3;
d = 4;
Agora, suponha, eu estou interessado apenas no terceiro valor de retorno. Isso pode ser conseguido criando uma variável dummy:
[dummy, dummy, variableThatIWillUse, dummy] = func;
clear dummy;
Mas acho que isso é meio feio . Eu acho que você pode fazer algo como uma das seguintes coisas, mas não pode:
[_, _, variableThatIWillUse, _] = func;
[, , variableThatIWillUse, ] = func;
variableThatIWillUse = func(3);
variableThatIWillUse = func()(3);
Existem maneiras elegantes de fazer isso funcionar?
Até agora, a melhor solução é simplesmente usar a variableThatIWillUse
variável como dummy. Isso me impede de ter que criar uma variável fictícia real que polui o espaço de trabalho (ou que eu precisaria limpar). Resumindo: a solução é usar o variableThatIWillUse
valor de cada retorno até o interessante. Os valores de retorno depois podem simplesmente ser ignorados:
[variableThatIWillUse, variableThatIWillUse, variableThatIWillUse] = func;
Ainda acho que esse é um código muito feio, mas se não houver uma maneira melhor, acho que vou aceitar a resposta.
fonte
Respostas:
Isso é um hack, mas funciona:
Primeiro, uma função de exemplo rápido:
Agora, a chave aqui é que, se você usar uma variável duas vezes no lado esquerdo de uma atribuição de múltiplas expressões, uma atribuição anterior será derrotada pela atribuição posterior:
(editar: apenas para verificar, também verifiquei que essa técnica funciona
[mu,mu,mu]=polyfit(x,y,n)
se tudo o que você mais gostapolyfit
é o terceiro argumento)editar: existe uma abordagem melhor; veja a resposta de ManWithSleeve .
fonte
Com o MATLAB Versão 7.9 (R2009b), você pode usar um ~, por exemplo,
Observe que
,
não é opcional. Apenas digitar[~ ~ var]
não funcionará e gerará um erro.Veja as notas de versão para detalhes.
fonte
not
operador emdon't care
que não é ruim,
não é opcional. Digitando apenas[~ ~ var]
irá não trabalho, e lançará um erro.Se você deseja usar um estilo em que uma variável será deixada cair no bucket de bits, uma alternativa razoável é
ans é, obviamente, a variável de lixo padrão do matlab, sendo substituída com frequência no decorrer de uma sessão.
Embora eu goste do novo truque que o MATLAB agora permite, usar um ~ para designar uma variável de retorno ignorada, isso é um problema de compatibilidade com versões anteriores, pois os usuários de versões mais antigas não poderão usar seu código. Eu geralmente evito usar coisas novas assim até que pelo menos alguns lançamentos do MATLAB tenham sido lançados para garantir que haverá muito poucos usuários no caminho. Por exemplo, mesmo agora, acho que as pessoas ainda estão usando uma versão do MATLAB com idade suficiente para não poderem usar funções anônimas.
fonte
Aqui está outra opção que você pode usar. Primeiro, crie uma matriz de células para capturar todas as saídas (você pode usar a função NARGOUT para determinar quantas saídas uma determinada função retorna):
Em seguida, chame a função da seguinte maneira:
Em seguida, basta remover o elemento de um que você deseja e substituir um :
fonte
Eu escrevi uma k-ésima função:
então você pode ligar
você também pode encerrar a função como
após o qual você usa
observe que há uma sobrecarga associada ao uso de funções anônimas como essa, e isso não é algo que eu faria no código que seria chamado milhares de vezes.
fonte
No Matlab 2010a, encontrei uma maneira elegante de fazer o que você está pedindo. É simplesmente usar o caractere "~" (sem as aspas, é claro) como sua variável dummy (quantas você desejar ao retornar vários parâmetros). Isso também funciona para parâmetros de entrada para funções, se as funções forem projetadas para manipular dados ausentes. Não sei se isso existia nas versões anteriores, mas me deparei com isso recentemente.
fonte
Você pode criar uma função (ou função anônima) que retorne apenas as saídas selecionadas, por exemplo
Então você pode chamar sua função assim:
Ou você pode atribuir a saída a uma variável:
fonte
decimatedfftx = select(fft(x,12),1:4:12);
select(func,2)
chamadasfunc(2)
. Não vejo onde isso seleciona argumentos de saída.Existe alguma razão para não usar ans (n), assim:
Dá b = 10 e dessa forma não seria compatível com todas as versões do Matlab?
Além disso, isso funciona para obter o segundo argumento de saída quando você não sabe quantos argumentos haverá! Considerando que, se você fizer isso:
Então b = 8000! (Você precisa terminar com ~, para pegar mais argumentos!)
fonte
size(a)
e[b,c]=size(a)
devolver coisas diferentes. As funções no MATLAB alteram o comportamento com base no número de argumentos de saída.