2010-07-19 5 views
9

Bir hücre dizisinin her öğesine bir işlev uygulamak istiyorum - bu yüzden bunun için cellfun var. Ancak, işlev hücre dizisinin tüm öğeleri için sabit tutmak istediğiniz iki ek argüman (bir dize ve bir vektör) alır; anlamHücre ekosunu (veya arrayfun veya structfun) sabit ek giriş argümanları ile nasıl uygulanır?

cellfun(@myfun, cellarray, const1, const2) 

: yani ben böyle bir şey yapmak istiyorum

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

const1 ve const2 ait numel(cellarray) kopyalarını içeren bir ara hücre dizileri yaratmadan bunu yapmak için bazı yolu var mı?

cevap

16

Sen iki ek argümanlarla myfun çağıran bir anonymous function kullanarak bunu yapabilirsiniz:

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

Şu anda bu çözümü kullanıyorum, fakat başka var mı? Büyük diziler için önemli miktarda ek yük üretebilir. Const1, const2'nin (iyi bir alternativ değil) kopya dizisini oluşturmak için tek alternatif mi? – embert

+1

@embert Fazladan ek yükün nereden geleceğinden emin değilim, ama belki de öğrenmek için profiler kullanabilirsiniz. Aynı zamanda, döngü için alternatifleri denemek isterim, çünkü döngüler MATLAB'da kullandıkları ceza türüne girmezler (bazen en hızlı alternatiflerdir). – gnovice

4

bir püf endeksleri üzerinde ARRAYFUN kullanmaktır:

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

myfun dönüş değerleri ise skaler değildir, 'UniformOutput',false seçeneğini ayarlamak isteyebilirsiniz.

İlgili konular