Estou um pouco surpreso que o MATLAB não tenha uma função Map, então eu mesmo criei um, já que é algo sem o qual não posso viver. Existe uma versão melhor por aí? Existe uma biblioteca de programação funcional padrão para MATLAB que estou perdendo?
function results = map(f,list)
% why doesn't MATLAB have a Map function?
results = zeros(1,length(list));
for k = 1:length(list)
results(1,k) = f(list(k));
end
end
o uso seria, por exemplo
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Will Ness
fonte
fonte
map
,foldl
(também conhecido comoreduce
),select
(akafilter
) e outros itens indispensáveis. Recomendado (se você tiver que usar Matlab).Respostas:
A resposta curta: a função integrada
arrayfun
faz exatamente o que suamap
função faz para matrizes numéricas:Existem duas outras funções integradas que se comportam de forma semelhante:
cellfun
(que opera em elementos de matrizes de células) estructfun
(que opera em cada campo de uma estrutura).No entanto, essas funções geralmente não são necessárias se você tirar proveito da vetorização, especificamente usando operadores aritméticos elementares . Para o exemplo que você deu, uma solução vetorizada seria:
Algumas operações irão operar automaticamente entre os elementos (como adicionar um valor escalar a um vetor), enquanto outros operadores têm uma sintaxe especial para operação em elementos (denotada por a
.
antes do operador). Muitas funções embutidas no MATLAB são projetadas para operar em argumentos vetoriais e matriciais usando operações elementares (frequentemente aplicadas a uma determinada dimensão, comosum
emean
por exemplo) e, portanto, não requerem funções de mapa.Para resumir, aqui estão algumas maneiras diferentes de enquadrar cada elemento em uma matriz:
Obviamente, para uma operação tão simples, a opção nº 1 é a escolha mais sensata (e eficiente).
fonte
Além das operações vetoriais e de elementos, também
cellfun
há funções de mapeamento em matrizes de células. Por exemplo:Se 'UniformOutput' for verdadeiro (ou não fornecido), ele tentará concatenar os resultados de acordo com as dimensões da matriz de células, então
fonte
Uma solução bastante simples, usando a vetorização do Matlab seria:
Agora digitando
retorna
c (b) é uma referência a um vetor de tamanho 5 com os elementos de c nos índices dados por b. Agora, se você atribuir valores a este vetor de referência, os valores originais em c são substituídos, pois c (b) contém referências aos valores em ce nenhuma cópia.
fonte
Parece que o arrayfun integrado não funciona se o resultado necessário for um array de funções: por exemplo: map (@ (x) [xx ^ 2 x ^ 3], 1: 10)
os pequenos mods abaixo tornam este trabalho melhor:
fonte
..., 'UniformOutput', false);
para criar uma saída de array de células contendo seus arrays, então formatar e combiná-los como quiser em um array não celular.Se o matlab não tiver uma função de mapa embutida, pode ser devido a considerações de eficiência. Em sua implementação, você está usando um loop para iterar os elementos da lista, o que geralmente é desaprovado no mundo do matlab. A maioria das funções embutidas do matlab são "vetorizadas", ou seja, é mais eficiente chamar uma função em um array inteiro do que iterar você mesmo e chamar a função para cada elemento.
Em outras palavras, este
é muito mais rápido que isso
assumindo sua definição de mapa.
fonte
Você não precisa,
map
já que uma função escalar que é aplicada a uma lista de valores é aplicada a cada um dos valores e, portanto, funciona de forma semelhante amap
. Apenas tenteNo seu caso particular, você pode até escrever
fonte
Vetorizar a solução conforme descrito nas respostas anteriores é provavelmente a melhor solução para velocidade. A vetorização também é muito Matlaby e se sente bem.
Com isso, o Matlab agora tem uma classe container Map.
Veja http://www.mathworks.com/help/matlab/map-containers.html
fonte
cellfun
et al., Não tabelas hash ou pares de valor-chave.