2010-07-19 4 views
9

셀 배열의 각 요소에 함수를 적용하려면 - cellfun이 필요합니다. 그러나이 함수는 두 개의 추가 인수 (문자열과 벡터)를 사용합니다.이 인수는 셀 배열의 모든 요소에 대해 일정하게 유지됩니다. 의미일정한 추가 입력 인수를 사용하여 cellfun (또는 arrayfun 또는 structfun)을 적용하는 방법은 무엇입니까?

cellfun(@myfun, cellarray, const1, const2) 

: 즉, 내가 좋아하는 일을하고 싶습니다

for i = 1:numel(cellarray), 
    myfun(cellarray{i}, const1, const2); 
end 

const1const2numel(cellarray) 사본을 포함하는 중간 셀 어레이를 생성하지 않고이를 위해 어떤 방법이 있나요?

답변

16

당신은 두 개의 추가 인수 myfun를 호출하는 anonymous function 사용하여이 작업을 수행 할 수 있습니다

cellfun(@(x) myfun(x,const1,const2), cellarray) 
+0

현재이 솔루션을 사용하고 있지만 다른 것이 있습니까? 큰 배열의 경우 상당한 양의 오버 헤드가 발생할 수 있습니다. 'const1, const2' (좋은 대안이 아님) 복사본의 배열을 만드는 유일한 대안입니까? – embert

+1

@embert 추가 오버 헤드가 어디에서 오는지는 잘 모르겠지만 프로파일 러를 사용하여 알아낼 수 있습니다. 또한 for 루프는 MATLAB에서 사용했던 것과 같은 처벌을받지 않기 때문에 (심지어 가장 빠른 대안 일 수도 있습니다) 질문에서 for 루프 대안을 시도 할 것입니다. – gnovice

4

또 다른 트릭은 인덱스에 ARRAYFUN을 사용하는 것입니다

arrayfun(@(k) myfun(cellarray{k},const1,const2), 1:numel(cellarray)) 

myfun의 반환 값의 경우 스칼라가 아닌 경우 'UniformOutput',false 옵션을 설정하는 것이 좋습니다.