2011-01-25 24 views
5

Şu anda MATLAB'de bir benzetim kodluyorum ve yaşadığım bir sorun hakkında yardıma ihtiyacım var.MATLAB: Birleştirme İşlev Tutamaçları

I n ayrı anonim işlev hücresi dizisinin functions depolanan her biri f_i, kolları ve bir 1x1 sayısal dizi x_i kabul eder ve bir 1x1 sayısal dizi y_i döner sahip bir sorun üzerinde çalışıyorum. Bunları anonim fonksiyonunun her birleştirmek çalışıyorum

tek n x 1 sayısal diziyi X kabul eder ve tek n x 1 -sayısal dizi Y döndüren bir tek anonim işlev kolu içine işler. Burada X(i) = x_i, Örnek olarak Y(i) = y_i = f_i(x_i)

n = 2 izin vermedi ve f_1 ve iki fonksiyon giriş ve çıkış 1x1 diziler olduğunu kolları ve bir hücre dizisinde adlandırılmış işlevleri

Temelde o olur kodu gerekir
f_1 = @(x_1) x_1^2 
f_2 = @(x_2) x_2^3 
functions = {f_1,f_2} 

saklanır olmak f_2 n, f_1 ve f_2'u 2x1 sayısal dizisini girip çıkaran bir işlev tanıtıcısı F'yi kullanabilecektir.

F = @(x) [f_1(x(1,1));f_2(x(2,1))] 

cevap

5

O (nedeniyle ifadesi için fonksiyon vücudunda gereksinimi sınırlayıcı) içi @() -anonymous sözdizimi kullanılarak, böyle bir fonksiyon tanımlamak güçtür. Yine de, belirli bir vektörün öğeleri üzerinde çalışan bir olağan (anonim olmayan) işlevi tanımlamak ve verilen bir hücre dizisinden bu öğeler için işlevler uygulamak mümkündür.

function y = apply_funcs(f, x) 
    assert(length(f) == length(x)); 
    y = x; 
    for i = 1 : length(f) 
     y(i) = feval(f{i}, x(i)); 
    end 
end 

Ve her zaman sadece kendi @-Kulp için başvuru, diğer bazı birine bu işlevi geçmek için gerekli oluyor.

F = @apply_funcs 
+0

Teşekkür:

Ve burada bir kaç test durumları vardır! Ben mümkün olduğunca verimli olması için kodu gerekir, bu yüzden muhtemelen işlevini kullanın ve feval satır içi işlevi kolu değerlendirmesini kullanarak daha hızlı olup olmadığını bilmek olur uzunluk/iddia argümanlar ... Ayrıca , kaldıracak?Yani, y (i) = f {i} (x (i)) y'den daha hızlı (i) = feval (f {i}, x (i))> –

2

giriş argümanlar biçimlendirmek nasıl ilgili bazı farklar olacaktır ancak bu, a solution I provided to a similar previous question kullanılarak çözülebilir. Eğer bir satırda anonim fonksiyonlarını değerlendirmek için fonksiyonları CELLFUN ve FEVAL kullanarak istediğiniz neyi elde edebilirsiniz ve işlev NUM2CELLCELLFUN tarafından kullanılmak üzere bir hücre dizisi için giriş vektörü dönüştürmek için:

f_1 = @(x_1) x_1^2;  %# First anonymous function 
f_2 = @(x_2) x_2^3;  %# Second anonymous function 
fcnArray = {f_1; f_2}; %# Cell array of function handles 
F = @(x) cellfun(@feval,fcnArray(:),num2cell(x(:))); 

Not ben adı, FUNCTIONS yerleşik işlevi için kullanıldığından, işlev tanıtıcılarının hücre dizisi için fcnArray adını kullandı. colon operator (:), fcnArray ve giriş argümanı x'u zaten yoksa sütun vektörlerine döndürmek için kullanılır. Bu, çıktının bir sütun vektörü olmasını sağlar. Bunun için

>> F([2;2]) 

ans = 

    4 
    8 

>> F([1;3]) 

ans = 

    1 
    27 
+0

Tekrar teşekkürler. Sizin yaklaşımınız kesinlikle daha karmaşıktır, ancak bunun ib'in tanımladığı döngüden daha hızlı mı çalışacağını merak ediyorum. –

+0

k Her ikisini de deneyeceğim ve hangisinin daha iyi olduğunu görmeliyim - en iyi MATLAB uygulamalarını gösteren bir tür kaynağı biliyor musunuz? Ben her zaman mümkün olduğunca verimli benim kod yapmaya çalışıyorum, ancak MATLAB üzerinde dahili fonksiyonlar ile bu şeyler yapmak için genellikle 3-4 yolu vardır, ben neyin pahalı olduğunu ve ne olmadığını anlamak zor bir zaman geçiriyorum . –

1
#you can try 
[email protected](x)[x(1)^2;x(2)^3] 
>>f([1,2]) 
ans = 
    1 
    8 
>>f([2,3]) 
ans = 
    4 
    27