MATLAB'da, aynı dosyada bir komut dosyası ve işlev tanımına sahip olabilir miyim?


82

Bir fonksiyonum olduğunu f()ve onu my_file.mbir komut dosyası olan içinde kullanmak istediğimi varsayalım .

  1. İçinde tanımlanmış fonksiyona sahip olmak mümkün mü my_file.m?
  2. Değilse, benim tanımladığımı varsayalım f.m. Nasıl arayacağım my_file.m?

Çevrimiçi belgeleri okudum, ancak bunu yapmanın en iyi yolunun ne olduğu net değildi.


4
Octave'de komut dosyalarına işlevler koyabileceğinizi unutmayın.
Jeremiah Willcock



4
Gerçek soru şu olmalıdır: Mathworks'te bu saçma hatanın düzeltilmesi için kime şikayet ediyorum?
drysdam

3
MATLAB 2016b'den itibaren, fonksiyonlar betiklerde tanımlanabilir. Bu oldukça basit özelliği eklemek için neden 32 yıl beklediklerinden emin değilim.
onewhaleid

Yanıtlar:


49

R2016b yayımından itibaren, komut dosyalarında aşağıdaki gibi yerel işlevlere sahip olabilirsiniz :

data = 1:10;            % A vector of data
squaredData = f(data);  % Invoke the local function

function y = f(x)
  y = x.^2;
end

R2016b'yi piyasaya sürmeden önce, bir MATLAB betiği içinde tanımlanabilen tek işlev türü anonim bir işlevdi . Örneğin:

data = 1:10;            % A vector of data
f = @(x) x.^2;          % An anonymous function
squaredData = f(data);  % Invoke the anonymous function

Tek bir ifadede tanımlanmaları gerektiğinden, anonim işlevlerin basit işlemlere daha uygun olduğunu unutmayın. Daha karmaşık işlevler için, bunları kendi dosyalarında tanımlamanız, bunları komut dosyanız için erişilebilir hale getirmek için MATLAB yolunda bir yere yerleştirmeniz ve ardından başka herhangi bir işlevde yaptığınız gibi bunları komut dosyanızdan çağırmanız gerekecektir.


37

Bu sınırlamayı aşma şeklim, komut dosyalarımı bağımsız değişken içermeyen işlevlere dönüştürmektir (küresel ad alanından değişkenlere ihtiyacım varsa, bunları işlevde açıkça iletirim veya "evalin" i kullanarak onları kaparım.)

Daha sonra ihtiyacınız olan tüm ek fonksiyonları "script" içinde tanımlayabilirsiniz. Bu bir hack, ancak birkaç önemsiz olmayan işleve ihtiyaç duyduğum durumlarda oldukça güçlü buldum.

DÜZENLEME: İşte basit bir örnek. Bütün bunlar tek bir dosyada bulunabilir.

function [] = myScriptAsAFunction()
   img = randn(200);
   img = smooth(img);
   figure(1);
   imagesc(img);
   axis image;
   colorbar;
end

function simg = smooth(img)
    simg = img / 5;
end

6
+1, her şeyi temizlediğimde gerçekten canımı sıkıyor; hepsini kapat; matlab komut dosyasının en üstünde. Etrafta yüzen çok fazla değişken ve grafik varsa, onları takip edemiyorsunuz, yeterince işlev kullanmıyorsunuz demektir.
Bi Rico

1
Lütfen bu "hack" için örnek bir uygulama ekleyebilir misiniz? Bunun nasıl çalıştığını anlayamıyorum.
James Taylor

1
Bu yaklaşımla ilgili bir problemin, fonksiyondan çıkıldığında değişkenlerin asla çalışma alanınıza girmemesidir. Bu değişkenleri komut dosyasının sonunda oynatmak / bakmak / kullanmak istiyorsanız bu bir sorun olabilir.
chessofnerd

1
@chessofnerd Bir problemim olduğunda, ya fonksiyon çıktısındaki değişkenleri döndürürüm ya da atamayı kullanırım.
John

1
@John, kişisel olarak, çalışma alanında kendi başlarına görünmelerini sağlamak yerine tüm değişkenleri ayrı ayrı döndürmek zorunda kalmanın biraz acı verici olduğunu hissediyorum. Bunu hiç duymamıştım dedi assignin. Bu, daha çok kullanıyor olabileceğim güzel bir işlev!
chessofnerd

19

Bunun gibi bir şey yapabilirsiniz (dosyanızın adlandırılmış olduğunu varsayarak my_file.m):

function my_file
   %script here
end

function out = f(in)
   %function here
end

Çalıştır düğmesine tıklarsanız, işlev my_filevarsayılan olarak yürütülür.


2
Bu John'un cevabından farklı mı?
sancho.s ReinstateMonicaCellio

7

1) Bir komut dosyasının içine bir işlevi yerleştiremezsiniz.

2) fm'nin yolunuzda veya geçerli dizinde olduğundan emin olun ve onu herhangi bir işlev gibi çağırabilirsiniz.


@Oneiros tarafından önerileni takip ederseniz, bir işlevi bir komut dosyasının içine yerleştirebilirsiniz. Fonksiyonunuzu ( fonun örneğinde) senaryonuzun içinden ( onun örneğinde) çağırabilirsiniz my_file.
marcelocra

7

R2016b'den itibaren, bir betik içinde yerel işlevleri tanımlayabilirsiniz.

x = 1;
y = add1(x);

function z = add1(x)
    z = x + 1;
end

3

Çözümü John tarafından uyguladım ve yararlı buldum. Ancak birkaç uyarı var (Octave'de; Matlab muhtemelen benzer şekilde davranır):

  1. Ana işlevinizin içindeki kod clear all, yardımcı işlevi kullanmadan önce içeriyorsa , çalışmayacaktır. Dosyada test3.m, yorum yapma / açıklamayı kaldırma clear all, kodun çalışmasına / çalışmamasına neden olur.

    function [] = test3()
      %clear all
      a = myfunc( 1 );
      a
    endfunction;
    
    %---------------------------------
    % Auxiliary functions
    
    function retval = myfunc( a )
      retval = 2 * a;
    endfunction;
    

    Başlangıç ​​Bir komut dosyası çalıştırıldığında, işlevlerin dışındaki kodun çalıştırıldığı (bu durumda böyle bir kod olmadığı) ve tanımlanmış işlevlerin (bu durumda test3ve myfunc) çalışma alanına eklendiği bir ilk geçiş var gibi görünüyor . İkinci bir geçiş , aktif myfuncolup olmadığını bulamayan ana işlevi yürütür clear all.

  2. Chessofnerd tarafından belirtildiği gibi, ana işlevinizdeki kullanıma hazır değişkenler çalışma alanına gitmez.


2

Örnek bir dosyada birçok işleve sahip olabilirsiniz. Ancak dosyayı çalıştırdığınızda yalnızca birincisi ana işlev olarak hareket edebilir. Diğerleri yalnızca bu dosyada kullanılabilir. Bazı durumlar için büyük bir işlev tanımlamak istersiniz. Bunu daha küçük işlevlere ayırabilir ve altında tanımlayabilirsiniz.

Ancak cevabı bulmanın en basit yolu denemektir ~

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.