MATLAB의지도 기능?


100

MATLAB에 Map 기능이 없다는 사실에 조금 놀랐습니다. 그래서 내가 없이는 살 수없는 것이기 때문에 직접 해킹했습니다. 더 나은 버전이 있습니까? 내가 놓친 MATLAB 용 다소 표준 함수 프로그래밍 라이브러리가 있습니까?

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

사용법은 예입니다.

map( @(x)x^2,1:10)

12
다른 언어에서 Matlab으로가는 레슨 # 1 : for 루프를 사용하지 마십시오. 벡터화 된 솔루션보다 몇 배 더 느립니다.
CookieOfFortune

15
JIT가 도입됨에 따라 for 루프는 이전에했던 페널티를받지 않습니다.
MatlabDoug

@CookieOfFortune 더 이상 사실이 아닌 것 같아요 ...
Ander Biguri

2
@AnderBiguri 나는 그들이 몇 가지 개선 사항을 추가했다고 생각하지만 여전히 훨씬 느립니다.
CookieOfFortune 2013 년

파일 교환 의 기능 라이브러리 에는 map, foldl(라고도 함 reduce), select(일명 filter) 및 기타 필수 기능이 있습니다. 권장합니다 (Matlab을 사용해야하는 경우).
Ahmed Fasih

답변:


133

짧은 대답 : 내장 함수는 숫자 형 배열에 대해 함수가 arrayfun수행하는 작업을 정확히 map수행합니다.

>> y = arrayfun(@(x) x^2, 1:10)
y =

     1     4     9    16    25    36    49    64    81   100

유사하게 작동하는 두 가지 다른 내장 함수가 있습니다. cellfun(셀형 배열의 요소에서 작동) 및 structfun(구조의 각 필드에서 작동).

그러나 벡터화, 특히 요소 별 산술 연산자를 사용하는 경우 이러한 함수는 종종 필요하지 않습니다 . 당신이 준 예에서 벡터화 된 솔루션은 다음과 같습니다.

>> x = 1:10;
>> y = x.^2
y =

     1     4     9    16    25    36    49    64    81   100

일부 연산은 요소간에 자동으로 작동하며 (예 : 벡터에 스칼라 값 추가) 다른 연산자는 요소 별 연산을위한 특수 구문 ( .연산자 앞에으로 표시됨 )이 있습니다. MATLAB의 많은 내장 함수는 요소 별 연산 (종종 예를 들어 sum및 같은 주어진 차원에 적용됨)을 사용하여 벡터 및 행렬 인수에서 작동하도록 설계되었으므로 mean맵 함수가 필요하지 않습니다.

요약하면 다음은 배열의 각 요소를 제곱하는 몇 가지 다른 방법입니다.

x = 1:10;       % Sample array
f = @(x) x.^2;  % Anonymous function that squares each element of its input

% Option #1:
y = x.^2;  % Use the element-wise power operator

% Option #2:
y = f(x);  % Pass a vector to f

% Option #3:
y = arrayfun(f, x);  % Pass each element to f separately

물론 이러한 간단한 작업의 경우 옵션 # 1이 가장 현명하고 효율적인 선택입니다.


2
옵션 1은 더 간단 할뿐만 아니라 더 빠릅니다 (옵션 3에 비해 2는 1과 매우 유사해야합니다)!
Diederick C. Niehorster 2014-01-05

10

벡터 및 요소 별 연산 외에도 cellfun셀형 배열에 대한 함수 매핑 도 있습니다. 예를 들면 :

cellfun(@upper, {'a', 'b', 'c'}, 'UniformOutput',false)
ans = 
    'A'    'B'    'C'

'UniformOutput'이 참 (또는 제공되지 않음)이면 셀형 배열의 차원에 따라 결과를 연결하려고 시도하므로

cellfun(@upper, {'a', 'b', 'c'})
ans =
ABC

2

Matlab의 벡터화를 사용하는 다소 간단한 솔루션은 다음과 같습니다.

a = [ 10 20 30 40 50 ]; % the array with the original values
b = [ 10 8 6 4 2 ]; % the mapping array
c = zeros( 1, 10 ); % your target array

자, 타이핑

c( b ) = a

보고

c = 0    50     0    40     0    30     0    20     0    10

c (b)는 b로 주어진 인덱스에 c 요소가있는 크기 5의 벡터에 대한 참조입니다. 이제이 참조 벡터에 값을 지정하면 c (b)에 c의 값에 대한 참조가 포함되고 복사본이 없기 때문에 c의 원래 값을 덮어 씁니다.


1

필요한 결과가 함수의 배열 인 경우 내장 arrayfun이 작동하지 않는 것 같습니다. 예 : map (@ (x) [xx ^ 2 x ^ 3], 1 : 10)

아래의 약간의 모드를 사용하면 더 잘 작동합니다.

function results = map(f,list)
% why doesn't MATLAB have a Map function?
for k = 1:length(list)
    if (k==1)
        r1=f(list(k));
        results = zeros(length(r1),length(list));
        results(:,k)=r1;
    else
        results(:,k) = f(list(k));

    end;
end;
end

5
ARRAYFUN 이 예제에서 작동합니다. 입력 인수 ..., 'UniformOutput', false);를 포함하여 배열 을 포함하는 셀형 배열 출력을 만든 다음 원하는대로 형식을 지정하고 결합하여 셀이 아닌 배열로 만들어야합니다.
gnovice

0

matlab에 내장 된지도 기능이없는 경우 효율성 고려 사항 때문일 수 있습니다. 구현에서 루프를 사용하여 목록의 요소를 반복하고 있으며 일반적으로 MATLAB 세계에서 눈살을 찌푸립니다. 대부분의 내장 matlab 함수는 "벡터화"되어 있습니다. 즉, 직접 반복하고 각 요소에 대해 함수를 호출하는 것보다 전체 배열에서 함수를 호출하는 것이 더 효율적입니다.

즉,이


a = 1:10;
a.^2

이것보다 훨씬 빠르다


a = 1:10;
map(@(x)x^2, a)

지도의 정의를 가정합니다.


2
그의 요점은 그가 반드시 루프를 원했던 것이 아니라 제공된 함수를 제공된 배열의 해당 요소에 적용한 결과 배열을 결과로 갖는 것으로 지정되기를 원했다는 것입니다. 나는 matlab을 많이 모르지만 arrayfun이 일을하는 것 같습니다.

1
대부분의 내장 Matlab 함수와 연산자는 이미 그렇게합니다. 입력 배열의 각 요소에 대해 작동하고 해당 결과 배열을 반환합니다.
Dima

0

당신은 필요가 없습니다 map값 목록에 적용되는 스칼라 함수는 각각의 값에 적용되고, 따라서 유사 작동하기 때문에 map. 단지 시도

l = 1:10
f = @(x) x + 1

f(l)

특정 경우에는 다음과 같이 쓸 수도 있습니다.

l.^2

9
-1 : 사실이 아닙니다. Matlab에는 스칼라 함수를 지정할만큼 강력한 유형 시스템이 없습니다. f는 벡터와 함께 호출되고 단일 벡터 추가가 예제에서 수행됩니다. 이를 확인하려면 코드 샘플을 프로파일 링하십시오 (코드를 실행하기 전에 "프로파일 켜기", 그 뒤에 "프로파일 끄기"). f에 대한 단일 호출이 있음을 알 수 있습니다.
Mr Fooz

-1

이전 답변에서 설명한대로 솔루션을 벡터화하는 것이 아마도 속도를위한 최상의 솔루션 일 것입니다. 벡터화는 매우 Matlaby이며 기분이 좋습니다.

이제 Matlab에는 Map 컨테이너 클래스가 있습니다.

참조 http://www.mathworks.com/help/matlab/map-containers.html를


Op는 cellfun해시 테이블이나 키-값 쌍이 아닌 고차 함수, 즉 등을 말합니다.
Ahmed Fasih
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.