Jestem trochę zaskoczony, że MATLAB nie ma funkcji Map, więc zhakowałem jeden razem, ponieważ jest to coś, bez czego nie mogę żyć. Czy jest tam lepsza wersja? Czy jest jakaś standardowa funkcjonalna biblioteka programistyczna dla MATLAB, której brakuje?
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
użycie byłoby np
map( @(x)x^2,1:10)
matlab
functional-programming
map-function
Will Ness
źródło
źródło
map
,foldl
(znany również jakoreduce
),select
(akafilter
) oraz inne niezbędne gadżety. Zalecane (jeśli musisz używać Matlab).Odpowiedzi:
Krótka odpowiedź: funkcja wbudowana
arrayfun
robi dokładnie to samo, co twojamap
funkcja dla tablic numerycznych:Istnieją dwie inne wbudowane funkcje, które zachowują się podobnie:
cellfun
(które działają na elementach tablic komórek) istructfun
(które działają na każdym polu struktury).Jednak te funkcje często nie są konieczne, jeśli korzystasz z wektoryzacji, w szczególności przy użyciu operatorów arytmetycznych opartych na elementach . Na przykład, który podałeś, wektoryzowanym rozwiązaniem byłoby:
Niektóre operacje będą automatycznie działać na elementach (np. Dodawanie wartości skalarnej do wektora), podczas gdy inne operatory mają specjalną składnię dla operacji elementarnych (oznaczoną a
.
przed operatorem). Wiele funkcji wbudowanych w MATLAB-ie jest zaprojektowanych do działania na argumentach wektorowych i macierzowych za pomocą operacji elementarnych (często stosowanych do danego wymiaru, takiego jaksum
imean
na przykład), a zatem nie wymaga funkcji mapowania.Podsumowując, oto kilka różnych sposobów prostowania każdego elementu w tablicy:
Oczywiście dla tak prostej operacji opcja nr 1 jest najbardziej rozsądnym (i wydajnym) wyborem.
źródło
Oprócz operacji opartych na wektorach i elementach istnieje również
cellfun
funkcja mapowania funkcji na tablicach komórek. Na przykład:Jeśli parametr „UniformOutput” ma wartość true (lub nie został podany), spróbuje połączyć wyniki zgodnie z wymiarami tablicy komórek, więc
źródło
Dość prostym rozwiązaniem, wykorzystującym wektoryzację Matlaba, byłoby:
Teraz piszę
zwroty
c (b) jest odniesieniem do wektora o rozmiarze 5 z elementami c przy indeksach podanych przez b. Teraz, jeśli przypiszesz wartości do tego wektora odniesienia, oryginalne wartości w c zostaną nadpisane, ponieważ c (b) zawiera odniesienia do wartości c i żadnych kopii.
źródło
Wygląda na to, że wbudowana funkcja arrayfun nie działa, jeśli wynikiem jest tablica funkcji: np .: map (@ (x) [xx ^ 2 x ^ 3], 1: 10)
niewielkie modyfikacje poniżej sprawiają, że działa to lepiej:
źródło
..., 'UniformOutput', false);
aby utworzyć wynikową tablicę komórek zawierającą twoje tablice, a następnie sformatować i połączyć je w dowolny sposób w tablicę inną niż komórkowa.Jeśli Matlab nie ma wbudowanej funkcji mapy, może to być spowodowane względami wydajności. W swojej implementacji używasz pętli do iteracji po elementach listy, co jest generalnie źle widziane w świecie Matlab. Większość wbudowanych funkcji Matlab jest „wektoryzowana”, co oznacza, że bardziej wydajne jest wywołanie funkcji na całej tablicy niż samodzielne iterowanie po niej i wywoływanie funkcji dla każdego elementu.
Innymi słowy, to
jest znacznie szybszy niż to
zakładając twoją definicję mapy.
źródło
Nie potrzebujesz,
map
ponieważ funkcja skalarna, która jest stosowana do listy wartości, jest stosowana do każdej z wartości i dlatego działa podobnie domap
. SpróbujW twoim konkretnym przypadku możesz nawet pisać
źródło
Wektoryzacja rozwiązania opisanego w poprzednich odpowiedziach jest prawdopodobnie najlepszym rozwiązaniem dla szybkości. Wektoryzacja jest również bardzo matowa i dobrze się czuje.
Powiedziawszy to, Matlab ma teraz klasę kontenera Map.
Zobacz http://www.mathworks.com/help/matlab/map-containers.html
źródło
cellfun
Et al., A nie o tabelach skrótów ani parach klucz-wartość.