2013-07-03 103 views
0

我有一個算法寫在一個m文件中,我有幾個函數,我在另一個.m文件中創建。我想從主算法.m文件中將這幾個函數稱爲獨立文件。我知道如何從一個文件調用另一個函數,但在這裏我想調用不同的函數,我在我的郵件算法文件中創建了一個單獨的文件。我已經在這裏搜索,但我得到的答案沒有幫助,並沒有談論我想要什麼。如何從一個.m matlab文件調用多個函數

這裏是我所談論的是一個小例證:有幾個可變

main algo file 
N = 30; 
x = -10 + 20rand(1,N) 
for j = 1 to N 
    c = f1(x) % here i need to call different functions from another file 
end 

功能,這是一個單獨的文件

Function perform 

%% Function F1 
f = f1(x) 
statements 
end 

%% Function F2 
f = f2(x) 
statements 
end 

%% Function F3 
f = f3(x) 
statements 
end 

%% Function F4 
f = f4(x) 
statements 
end 

%% Function F5 
f = f5(x) 
statements 
end 

end Perform 

我想被要求在F1至F4主要的algo .m文件。你怎麼能這樣做。另外它會更好,如果每次我運行主要算法.m文件時,它會提示我選擇要調用的F1到F4函數中的哪一個函數,並且我輸入並在dailog框中指示該函數,它會調用該特定函數功能。有關如何做到這一點的任何想法嗎?

+1

@Shai不知道它是重複的。在你的問題中,你不想接受改變公共功能的解決方案,而在這裏OP_implements_它,所以我想他是開放的建議... –

+0

@EitanT如果他願意改變實施,爲什麼不把每個私有函數寫在它自己的m文件中並完成它?如果他想要更多的挑戰讓自己的生活變得更加複雜,那麼他可能會試着用10本平衡在頭頂的書來實現它... – Shai

+0

@Shai我也會這樣做(關於m文件,而不是書),但我可以理解爲什麼要避免混亂的m文件。 –

回答

2

MATLAB documentation狀態:

MATLAB®程序文件可以包含一個以上的功能代碼。文件中的第一個函數(主函數)對其他文件中的函數可見,或者可以從命令行調用它。文件中的其他功能稱爲本地功能。本地功能只對同一文件中的其他功能可見。

所以其實,你可以叫這個M文件之外的唯一功能是第一個功能(這是perform在你的例子),而功能f1,...,f5只能在內部調用m-file,因爲它們是本地

我的建議是堅持推薦的做法,並在自己的m文件中定義每個函數。但是,如果您不想以大量m文件結束,並堅持使用相同的m文件實現所有功能,則可以通過向主函數傳遞附加參數來解決此問題,如下所示:

function f = perform(func, x); 
    switch(func) 
     case 'f1' 
      f = f1(x); 
     case 'f2' 
      f = f2(x); 
     case 'f3' 
      f = f3(x); 
     case 'f4' 
      f = f4(x); 
     case 'f5' 
      f = f5(x); 
     otherwise 
      error(['Unknown function ', func]); 
    end 

%// ... next follows the implementation of f1 through f5 

,然後通過調用perform與相應的函數名字符串調用每個功能f1,...,f5。例如:

perform('f1', some_variable) 
+0

所以你基本上說我不能調用函數在函數中執行主算法文件中的文件,對嗎?順便說一句,我正在使用matlab版本R2008b。 – kumba

+0

@ kumba嚴格地說,沒有。但我已經提出了一個解決方法。請參閱我的編輯。 –

+0

哦,主算法和所有的幾個F1到F5函數必須在一個文件中。是否必須在主算法之後或之前實施電子病例陳述和F1至F5功能? – kumba

0

只是爲了補充Eitan T的回答;還有另一種解決方法,它遵循大多數C族語言(實際上還有其他一些其他語言)中的「包含文件」類比。它的工作原理就像這樣:

主要算法中的文件:

function main 

    %// "include" the function definitions 
    f = declareFunctions; 

    %// Call desired function like so 
    for jj = 1:N 
     c1 = f{1}(x) %// call f1(x) 
     c2 = f{2}(x) %// call f2(x) 
     %// ... 
     cN = f{N}(x) %// call fN(x) 
    end 

end 

功能定義文件:

%// "Declare" all subfunctions in a caller's workspace 
function fs = declareFunctions 

    fs = {... 
     @f1,... 
     @f2,... 
     @f3,... 
     %//... etc. 
     @fN 
    }; 

end 

%// first function 
function y = f1(x) 
    %// f1's code 
end 


%// Second function 
function y = f2(x) 
    %// f2's code 
end 

%// ... 

%// Nth function 
function y = fN(x) 
    %// fN code 
end 
+0

如果你說%「包含」函數定義,你是指sytax? #include f1; #include f2;等等? – kumba

+0

@kumba:更像是你會在C/C++中使用'#include「functions.h」',其中'functions.h'包含* all *你的函數定義。這個想法或多或少是相同的,但是當然,完全不同的語法(例如,不需要'functions.cpp'文件) –

+1

@kumba'%include'部分不過是一個評論,實際上,Rody的代碼在主工作區中創建了一個函數句柄的單元陣列,並且通過訪問適當的單元格調用每個函數,_e.g_調用'f1 (x)'就像這樣:'f {1}(x)'。 –

1

另一種解決方法是創建一個classstatic相當於原來的功能的方法。然後所有東西都捆綁到一個.m類文件中。

相關問題