Por exemplo, se eu quiser ler o valor do meio magic(5)
, posso fazer o seguinte:
M = magic(5);
value = M(3,3);
para conseguir value == 13
. Eu gostaria de poder fazer algo como um destes:
value = magic(5)(3,3);
value = (magic(5))(3,3);
dispensar a variável intermediária. No entanto, o MATLAB reclama Unbalanced or unexpected parenthesis or bracket
do primeiro parêntese antes do 3
.
É possível ler valores de uma matriz / matriz sem primeiro atribuí-lo a uma variável?
matlab
indexing
matrix
return-value
variable-assignment
Joe Kearney
fonte
fonte
testmatrix('magi', 5)(3, 3)
Scilab e omagic(5)(3, 3)
Octave funcionam como um encanto!Respostas:
Na verdade, é possível fazer o que você deseja, mas é necessário usar a forma funcional do operador de indexação. Quando você executa uma operação de indexação usando
()
, na verdade está fazendo uma chamada para asubsref
função. Portanto, mesmo que você não possa fazer isso:Você pode fazer isso:
Feio, mas possível. ;)
Em geral, você só precisa alterar a etapa de indexação para uma chamada de função para não ter dois conjuntos de parênteses imediatamente após o outro. Outra maneira de fazer isso seria definir sua própria função anônima para fazer a indexação subscrita. Por exemplo:
No entanto, quando tudo estiver dito e feito, a solução temporária de variável local é muito mais legível, e definitivamente o que eu sugeriria.
fonte
clear
a temporária (que ninguém nunca faz) - o temporário tende a ficar por mais tempoHavia apenas um bom post sobre Loren na Art of Matlab, alguns dias atrás, com algumas jóias que poderiam ajudar. Em particular, o uso de funções auxiliares como:
onde
paren()
pode ser usado comoretornaria
Eu também suporia que isso será mais rápido que a resposta do gnovice, mas não marquei (Use o criador de perfil !!!). Dito isto, você também precisa incluir essas definições de função em algum lugar. Pessoalmente, eu as fiz funções independentes no meu caminho, porque elas são super úteis.
Essas funções e outras agora estão disponíveis no complemento Functional Programming Constructs, disponível no MATLAB Add-On Explorer ou no File Exchange .
fonte
myfunc().attr
?myfunc()
retorna uma estrutura que inclui um atributoattr
, para acessarattr
atualmente eu preciso fazerS = myfunc(); S.attr
. A questão é se podemos ter uma função auxiliar comogetattr(myfunc(), 'attr')
em analogia aos auxiliaresparen
ecurly
. Não entendo o que isso tem a ver com a caixa de ferramentas do banco de dados.Como você se sente ao usar recursos não documentados:
ou para matrizes de células:
Como mágica :)
ATUALIZAR:
Más notícias, o hack acima não funciona mais no R2015b ! Tudo bem, era uma funcionalidade não documentada e não podemos confiar nela como um recurso suportado :)
Para aqueles que se perguntam onde encontrar esse tipo de coisa, procure na pasta
fullfile(matlabroot,'bin','registry')
. Há um monte de arquivos XML lá que listam todos os tipos de brindes. Esteja avisado de que chamar algumas dessas funções diretamente pode travar facilmente sua sessão do MATLAB.fonte
':'
para evitar o erroUndefined function or variable "builtin"
.builtin('_paren', magic(5), ':', 2)
(em certos lugares, ele funciona sem as aspas diretamente,:
ao contrário':'
, como quando executado no prompt de comando diretamente, não de dentro de uma função. isso é um bug no analisador)!end
isso?end
-trickery não trabalho nesta sintaxe, você vai ter que ser explícito em sua indexação .. (mesma limitação se aplica para a maioria das outras respostas listadas)Pelo menos no MATLAB 2013a você pode usar
getfield
como:para obter o elemento em (1,2)
fonte
infelizmente a sintaxe like
magic(5)(3,3)
não é suportada pelo matlab. você precisa usar variáveis intermediárias temporárias. você pode liberar a memória após o uso, por exemplofonte
Observe que, se você comparar os tempos de execução com a maneira padrão (atribuir o resultado e acessar as entradas), eles serão exatamente iguais.
Na minha opinião, a linha inferior é: o MATLAB não tem ponteiros, você precisa conviver com isso.
fonte
Poderia ser mais simples se você criar uma nova função:
e depois use:
fonte
subref
isso que faz ... mas de uma maneira mais geral.Sua notação inicial é a maneira mais concisa de fazer isso:
Se você estiver fazendo isso em um loop, basta reatribuir M todas as vezes e ignorar a declaração clara também.
fonte
Para complementar a resposta de Amro, você pode usar em
feval
vez debuiltin
. Realmente não há diferença, a menos que você tente sobrecarregar a função do operador:O interessante é que
feval
parece ser um pouquinho mais rápido quebuiltin
(em ~ 3,5%), pelo menos no Matlab 2013b, o que é estranho, pois éfeval
necessário verificar se a função está sobrecarregada, ao contrário debuiltin
:fonte
feval
faz a coisa "normal" e, portanto, pode fazer pleno uso desta lista.builtin
deve procurar em outro lugar para encontrar apenas funções incorporadas. É provável que este caso não seja otimizado quase tanto quanto o caso “normal”, porque por que você investiu na otimização de algo que não é usado com muita frequência?