2016-03-31 37 views
1

yılında bu formdayeterli girdi argümanlar işleve

function [g] = g(i,j) 
    k=1; 

    if i==0 
     g=0; 
    elseif i==k 
     g=j; 
    end 

bir işleve sahip Ve ben kodunda ikinci çizgiyi istemiyoruz. Bunun yerine, fonksiyonun ana programdan k okumasını istiyorum. Ben bu şekilde ana programın kodunda i fonksiyonu, j ve k olarak g yazmak zorunda kalacak, çünkü yerine

function [g] = g(i,j,k) 

yazmak istemiyorum. Başka bir yolu var mı?

+0

g (i, j, k) 'ile işlevini çağırarak tüm sebebi' böyledir işleve sizin girişleri neler olduğunu bildiklerini ve şimdi bundan kaçınmak mı istiyorsun? Hangi güzel sebebin var? Alternatif olarak, ana programda k harfinin nasıl çalıştığını koyarsınız, böylece k'yi yeniden hesaplayabilir. – GameOfThrows

+0

@GameOfEkleri genel işlevini koruyan ana programda 'k' tanımlaması daha mantıklıdır, ancak her seferinde yine de can sıkıcı olabilir. Buraya fazladan çağrıldığını varsayalım, aksi takdirde ekstra bir tane daha ekleyelim, k 'kaçınmaktan kaçınacak bir şey değil. – Dan

+0

@Dan haklısınız, cevabınız bir alternatiftir, ancak bunun nasıl daha az iş olduğunu görmüyorum, daha sonra işlev çağrısına bir ', k 'ekleyerek, yani, hepsini değiştirmeyi tercih ediyorum, ama ben depolama alanından tasarruf etmeyi ve baytın bayt olduğunu ve ne olursa olsun iyi bir alternatif olduğunu tahmin edin. – GameOfThrows

cevap

3

closure oluşturmak için anonim bir işlev kullanabilirsiniz.

function [g] = g(i,j,k) 
    if i==0 
     g=0; 
    elseif i==k 
     g=j; 
    end 
end 

olarak işlev tanımlayın Ve sonra ana komut size

k=1; 
g2 = @(i,j)g(i,j,k); 

gibi bir şey yapabilirsiniz Ve şimdi g2 sen 1 olacak önce g ama k sesleniyordun şekilde çağırabilir ve irade Ana betiğinizde fonksiyonunuz yerine tanımlanmalıdır.

Yoksa bile tamamen k atlayıp tanımlayabiliriz:

g1 = @(i,j)g(i,j,1) 
+0

çok teşekkürler! mükemmel çalıştı. tam olarak ihtiyacım olan şey. – ourania