2010-07-19 9 views
9

Tôi muốn áp dụng một hàm cho mỗi phần tử của một mảng ô - vì vậy tôi có cellfun cho điều đó. Tuy nhiên, hàm này nhận thêm hai đối số (một chuỗi và một vectơ), mà tôi muốn giữ nguyên cho tất cả các phần tử của mảng ô; ví dụ: Tôi muốn làm điều gì đó như:Làm thế nào để áp dụng cellfun (hoặc arrayfun hoặc structfun) với các đối số đầu vào không đổi?

cellfun(@myfun, cellarray, const1, const2) 

nghĩa:

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

Có một số cách để làm điều đó mà không cần tạo mảng tế bào trung gian chứa numel(cellarray) bản sao của const1const2?

Trả lời

16

Bạn có thể làm điều này bằng một anonymous function mà các cuộc gọi myfun với hai đối số bổ sung:

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

Hiện tại tôi đang sử dụng giải pháp này, nhưng có cách nào khác không? Đối với mảng lớn, nó có thể tạo ra một lượng đáng kể chi phí. Là lựa chọn duy nhất để tạo ra một mảng các bản sao của 'const1, const2' (không phải là một lựa chọn thay thế tốt)? – embert

+1

@embert Tôi không chắc chắn nơi mà các chi phí phụ sẽ đến từ, nhưng có lẽ bạn có thể sử dụng profiler để tìm hiểu. Tôi cũng sẽ thử các thay thế cho vòng lặp trong câu hỏi, vì cho vòng không phải chịu loại hình phạt mà họ sử dụng để trong MATLAB (đôi khi họ thậm chí còn là sự thay thế nhanh nhất). – gnovice

4

lừa khác là sử dụng ARRAYFUN trên các chỉ số:

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

nếu các giá trị trở lại của myfun không phải là vô hướng, bạn có thể muốn đặt tùy chọn 'UniformOutput',false.