2011-11-20 51 views
0

我正在寫程序在八度和我遇到了一個問題,我實現了高斯 - Legandre正交和我傳遞給我的高斯 - Legandre函數幾個參數,我傳遞函數被集成在一個細胞立方體,所以我一次只能傳遞很少的功能。我有這段代碼:Matlab /八度功能處理程序和nargin

for weight=1:length(w) 
     temp=1; 
     for fun=1:length(c) 
      %liczenie iloczynu f(x_i)g(x_i), x_i - pieriwastki wielomianu Legandra 
      f=c{fun}; 
      nargin(func2str(c{fun})) 
      if (nargin (func2str(c{fun})) == 1) 
       disp('a'); 
       temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2); 
      else 
        (b-a)/2 * x(weight) + (a+b)/2; 
       temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points); 
      end 
     end 
     %mnozenie wyniku przez odpowiedni wspolczynnik - wage 
     temp*=w(weight); 
     result+=temp; 
    end 

在單元格數組中有函數處理函數,我想要集成的函數。根據函數的參數數量,我想使用兩個不同的函數調用。如果在單元陣列有處理程序是寫在.m文件在同一目錄作爲我的倍頻工作目錄一切正常,但是當我在八度定義函數運行時間,例如功能:

function result=a(x) 
    result=x*x 
    end 

鍵入

c{1}[email protected] 

,並通過該電池陣列我的功能Kwadratury有nargin

error: nargin: invalid function 
    error: called from: 

這是爲什麼,我怎麼能解決這個問題,這樣我就可以將f的錯誤不僅在.m文件中,而且在Octave中也是如此。

回答

0

我懷疑我有一個解決方案,但由於這是八度特定的,我大多習慣於MATLAB,所以您的里程可能會有所不同。

您可以通過提供字符串參數來調用nargin函數,這意味着nargin必須解析該函數​​並檢查參數的數量。當你在線聲明一個函數時,該函數被定義在該範圍內(即你的基本範圍),所以解析函數名稱將不會在任何函數內工作(或者它可能會解析爲一個內置函數,更壞的行爲)。

最好的解決辦法是用nargin(c{fun})代替nargin(func2str(c{fun}))。這樣你就可以傳遞實際的函數句柄,並且不需要將函數名稱解析爲實際的函數,因此不存在可能的歧義。

一般來說,我建議不要使用字符串來傳遞函數:爲什麼函數句柄包含在MATLAB中,所以任何讀你的代碼(或靜態代碼分析工具)的人都能理解你正在使用函數。使用字符串時,一切都變得模糊不清:字符串'a'是指函數a還是字母表中的第一個字母?

關於使用內聯函數,我不知道Octave是否支持這種功能,但如果您的功能非常簡單,那麼定義一個匿名函數(例如a = @(x)(x*x);)更容易。這是一個由MATLAB支持的結構,這樣可以使您的代碼更容易移植到其他環境中(當然,您仍然需要使用代替X *= A以兼容MATLAB)。

編輯: 另一種可能只是嘗試用多種參數的形式是否可行,回落到一個參數的形式,必要時:

try 
    (b-a)/2 * x(weight) + (a+b)/2; 
    temp*=f((b-a)/2 * x(weight) + (a+b)/2,I,points); 
catch ME 
    try 
     disp('a'); 
     temp*=c{fun}((b-a)/2 * x(weight) + (a+b)/2); 
    catch ME 
    end 
end 

你可能要檢查是否返回錯誤ME確實聲明使用錯誤數量的參數來允許其他錯誤通過。我承認這是一個醜陋的解決方法,但由於Octave顯然不支持nargin的函數句柄,所以它可能是獲得內聯函數所需的唯一方法。

+0

我開始使用func2str,因爲Octave中的nargin只接受一個字符串,但無論如何,我通過讓我的單元格還有其他參數來解決我的問題,所以當我知道我的函數接受3個變量時,我只是從c {fun ,2}等,我把所有的函數放在單獨的文件中,所以不用擔心範圍。 – Andna

+0

正如我之前所說的,我通過在自己的文件中包含每個函數來解決我的問題,需要那些內聯函數來加速我對自己的代碼的測試,但是我沒有,但是感謝您的幫助:)。 – Andna