2011-06-11 83 views
13

我對Matlab很陌生。我在.m文件中定義了一個函數,我想在另一個.m文件中使用該.m文件中的函數,並且我想從命令窗口運行最後一個.m文件的內容。使用Matlab導入另一個.m文件

我應該如何去做到這一點?

編輯 - 澄清,我有一個功能aa.m了,裏面b.m一個腳本,使用函數aa.m。我想從命令窗口裏面運行b.m這個腳本,但是我不知道該怎麼做。 (作爲一個方面說明,我完全可以轉換腳本b.m成一個函數如果需要的話)

編輯 - 現在我只需要知道如何導入/加載一個matlab文件,這就是它! !

+0

密切相關:[是否可以在MATLAB中爲每個文件定義多個函數?](http://stackoverflow.com/q/3569933/52738) – gnovice 2011-06-11 18:30:55

+0

@gnovice - 謝謝,但不幸的是,我沒有願望尚未在文件中定義多個函數。對不起,這個問題還不夠清楚。 – wrongusername 2011-06-11 20:32:42

回答

12

原則上,MATLAB主張使用一個函數根據.m文件。您可以從另一個.m文件和MATLAB命令行中調用這樣的功能。

您可以在一個.m文件中定義多個函數,但只能從其他.m文件或命令行訪問第一個(或「最外層」)函數。其他功能被視爲'助手'功能,這些功能只能在這個特定的.m文件中調用。

+0

嗨nimrodm,我將如何「從另一個.m文件調用這樣的功能」?這就是我需要知道的來回答這個問題,謝謝! – wrongusername 2011-06-12 20:57:57

+0

如果您有名爲'myfunc'的.m文件(並且該文件中的第一個非註釋行讀取爲「function y = myfunc(x)」),您只需編寫y1 = myfunc(x1)。 – nimrodm 2011-06-13 08:19:56

+0

非常感謝!但是,我將如何導入或加載這樣的文件?正如我所料,我得到了???未定義的函數或變量'getBz'.'沒有事先做任何事情。 – wrongusername 2011-06-13 17:50:18

13

如果我正確理解你的處境,你有這樣的事情:

的文件(`時三十分 '):

function results = A(parameters) 
    % some code 

的文件(`B.m'):

function results = B(parameters) 
    % some code 

您想使用的功能AB,你可以調用該函數從函數內部B:

function results = B(parameters) 
    % some code 
    otherResults = A(otherParameters) 

如果你的情況是一樣的東西nimrodm描述了,你A.m文件是一樣的東西:

function results = A(paramters) 
    % some code 
    function results = C(parameters) 
     % code of function C 
    end 
end 
    function results = D(parameters) 
     % code of function D 
    end 

沒有來自外部A直接訪問CD方式。如果您需要使用subfunctionDA,只要含有

function results = D(parameters) 
    % code of function D 
end 

文件D.m,最好,除去從功能A相同的代碼。

對於nested functionC,同樣可以在一些(但不是全部)的情況下完成,嵌套函數也可以訪問的功能A的變量。在最新版本的MATLAB(我猜R2010b或R2011a)中,編輯器突出顯示了在一個函數和teal中的嵌套函數之間共享的變量。如果您不使用功能C中的功能A的變量,則只需執行與功能D相同的功能。如果你這樣做,傳遞這些變量作爲參數和/或返回值,並調整代碼的其餘部分以反映這一點。測試您的代碼,然後執行與D相同的操作。

最有可能的是,你將不會有案例C,因爲這是MATLAB的高級功能。

然而還有另一種情況,如果你不使用MATLAB函數,而是MATLAB腳本在不同的文件中。你可以調用腳本(無論是從命令行和其他函數或腳本,僅僅通過它(文件)名

文件 E.m

內容:

文件 F.m
% code for script E 

內容:

% some code 
E; 

使用該代碼,您可以從腳本F內執行E中的所有命令。請注意,EF將共享其所有變量,因此如果您開始使用scrip由於類似於clear all; close all; clc;,您無法將F中的任何變量傳遞給E(在致電E之前,您將失去計算F的所有結果。

在大多數情況下,最好使用函數而不是腳本,所以這也是解決這種情況的方法:將所有事情都變成具有體面參數和返回值的函數。

編輯: 當你「改變」你的問題後,這很容易。

讓我們考慮你有這個功能,我將使用不同的名字,因爲這是更直觀的理解。您在ackermann.m文件內有ackermann功能,您可以從腳本bigScript.m調用該功能。

文件ackermann.m包含Ackermann-Péter功能(作爲一個例子):

function result = ackermann(m,n) 
    if m == 0 
     result = n + 1; 
    elseif m > 0 
     if n == 0 
      result = ackermann(m-1,1); 
     elseif n > 0 
      result = ackermann(m-1,ackermann(m,n-1)); 
     else 
      error('n has to be positive'); 
     end 
    else 
     error('m has to be positive'); 
    end 
end 

從你的大腳本中,你可以調用函數ackermann如下(如果你想M = 1和N = 1) :

A = ackermann(1,1) 

就是這麼簡單,不需要加載任何東西。但是,您需要記住讓函數在路徑中可用,最簡單的方法就是將腳本和函數文件保存在同一個目錄中。無論如何,我感覺你是一個開始的MATLAB用戶:如果你不知道一個函數是做什麼的,只需鍵入help functionname(代替函數名當然)到命令窗口。您會注意到函數load用於加載數據文件,而不是用於m文件(因爲路徑中的m文件是自動使用的)。

+2

恩,感謝Egon,但我假設我需要以某種方式導入另一個'.m'文件來使用它,就像在C++和Python和其他語言中一樣。我將如何做到這一點,因爲'加載a.m'給我一個關於列數不同的錯誤?另外,我會更新這個問題以使其更清楚。 – wrongusername 2011-06-11 20:35:16

+2

@wrongusername事實證明,你不需要做任何事情來「加載」function1.m到Matlab。如果function1.m和function2.m位於同一個文件夾中,則可以從function2.m()中調用function1() – solvingPuzzles 2012-04-24 02:41:59

11

爲別人尋找這個問題,像我一樣,只是類型:

addpath('[Path name of mat file]'); 

這將告訴MATLAB如何找到功能。要驗證,只需鍵入:

which [function name] 

如果成功,它應該列出剛添加的路徑名。

相關問題