2012-02-06 22 views
16

MATLAB işlevindeki değişkenleri bağlamak için deyimsel bir yol var mı? Bir fonksiyon yaratmak, birkaç argümanı bağlamak, sonra yeni fonksiyonu bir çeşit optimizatöre (benim durumumda, bir Newton çözücü) geçirmek oldukça yaygındır. Değişken kapsam belirleme kuralları iç içe geçmiş veya satır içi işlevlere sahip bir çözüme izin vermiyor gibi görünmüyor. Bir ders mi yaratmalıyım? MATLAB'ın birinci sınıf fonksiyon nesneleri olduğu görünmüyor, bu doğru mu? Kung-fu aramam kısa sürüyor. Teşekkürler! Örneğin, c parametresinin çeşitli değerleri için f (c, x) = x^3 + cx^2 + 2x + 3 köklerini bulmak istediğimi varsayalım. Newton'un bir metod çözücüsüne sahibim. Bu yüzden, c'nin çeşitli değerlerine geçiyorum, sonra bağlı fonksiyonu çözücüye iletiyorum.Kısmi İşlev Değerlendirme MATLAB

for c=1:10 
    g=f(c); % somehow bind value of c 
    seed=1.1; % my guess for the root of the equation 
    root=newton(g,seed); % compute the actual root 
end 
+1

Eğer bahsettiğini bir örnek verebilir misiniz? F = @ (x, y) (x + y) 'in ötesinde ne var? –

+1

Bir işlevi döndüren bir işlev mi demek istiyorsunuz? Örneğin. 'g = @ (baz, x) (@ (x) mod (x, taban)); f = g (3); 've şimdi' f (x) 'sadece' mod (x, 3) 'dir? –

cevap

19

Böyle yapabilirsiniz:

f = @(c,x)(@(x)(x^3+c*x^2+2*x+3)); 

for c=1:10 
    g=f(c); % g is @(x)(x^3+c*x^2+2*x+3) for that c 
    .... 
end 

anahtar ilk satırı: Bu bir işlev döndüren bir fonksiyondur. c değeriyle

yanı, o döner@(x)(x^3+c*x^2+2*x+3), bağlanmış.

+0

MATLAB'da @ -operator'un bu kullanımının adı nedir (arama amaçlı)? – dls

+1

'@ (args) (return val)' ile tanımlanan bir işlev, bir * anonim * işlevi olarak adlandırılır ve 'f' (ve' g') de "işlev tanıtıcıları" olarak adlandırılır. Bkz. [Burada] (http://www.mathworks.com.au/help/techdoc/matlab_prog/f4-70115.html). –

+2

Etkileyici, bunu sadece Octave'de doğruladım. F için ikinci argüman, daha sonra kukla bir değer ortaya çıkıyor. –

0

ben iç içe bir fonksiyon fminsearch ile kullanılabileceğini eminim. Newtons yöntemi hakkında özellikle bilmiyorum, ama benim tahminim sorun yok.

+0

Satır içi işlevlerden farklı olarak (iç içe geçmiş ve anonim işlevlerin varlığı dikkate alındığında oldukça anlamsız görünüyor), iç içe geçmiş işlevler, yuvalama kodu bloğundaki herhangi bir değişkenin kapsam dahilinde çalışır. Sadece aşağı tarafı, bu değişkenlere bunlara erişmek için açıkça bir ad vermek zorundasınız. Bunları başka bir şey için kullanacaksanız, bu tamam, ancak yalnızca iç içe işlev içinde başvurulacaksa tanımlayacak ve başlatacaksanız gereksiz görünmektedir. – dls