2012-05-02 50 views
4

似乎我有一個名爲「annotation」的變量和內置的MATLAB函數「annotation」中的一個變量名稱相沖突。MATLAB名稱衝突:「錯誤的參數數量」

在我的函數中,我加載一個包含變量註釋的.mat文件,然後嘗試將它用作另一個函數的參數。一個最小的工作示例如下:

function test() 

    filenames = { 'file1.mat', 'file2.mat', 'file3.mat' }; 

    for i = 1:numel(filenames) 
     in_file = char(filenames{i}); 
     out_file = strrep(in_file, '.mat', '_out.mat'); 

     prepare(out_file); % do something with the out file 

     load(out_file); % contains one variable named "annotation" 
     which annotation % just to be sure 

     other_function(annotation); 
    end 
end 

function prepare(filename) 
    annotation = rand(25, 1); 
    save(filename); 
end 

function other_function(annotation) 
    whos % just a stub - see whether it has been called 
end 

現在,在我的功能準備我確信該文件包含一個名爲「註釋」的變量。當我將它加載到主函數的循環中時,「which」命令告訴我它作爲變量存在,但在other_function的調用中,MATLAB試圖調用函數「annotation」:

註解是一個變量。

???使用錯誤==>註釋在71

沒有足夠的輸入參數

錯誤==>測試在14

 other_function(annotation); 

我很困惑,因爲我使用的變量名「註釋」在我的程序的幾個部分,也作爲函數調用的參數。我能想象的唯一解釋是MATLAB以某種方式預編譯我的代碼 - 在「編譯時」,變量「註釋」不可見。但是,在運行時發現可以從「which」命令的輸出中看到。

任何幫助將不勝感激!提前謝謝了。

注意:我正在使用MATLAB 7.12.0(R2011a)。

+0

即使你有在其他情況下取得成功,所有我會做的是改變你的變量annotation.Well的名字,我無法看到註釋作爲聲明中的代碼中的變量。正如我理解的Matlab,它只是覆蓋所有內容而不詢問,因爲它是腳本語言。你可以通過調試器去看看「哪個」裏面有什麼註釋嗎? –

+0

調試器會說註釋是一個變量,如果你在調試器中鍵入'annotation',它會評估它,而不會出錯。 – Richante

回答

0

這有點奇怪!我找到了同樣的東西。基本上,工作區變量不應該在函數內部(儘管它們來自內部腳本)。

如果你這樣做load(out_file)這是加載該文件的內容到工作區。所以他們不應該在範圍內,我相信。因此,我很驚訝which(annotation)稱它爲一個變量,但並不感到驚訝,因爲annotation超出了範圍。 (實際上,它看起來像Matlab的排序 - 把變量放在範圍內。)

我認爲你對annotation的某種預處理的想法聽起來似乎合理。例如,如果你用eval('other_function(annotation);')代替other_function(annotation),那麼它可能會工作(儘管我並不是說你應該使用eval,永遠)。

解決這將是這樣做的最佳方式:

data = load(out_file); 
annotation = data.annotation; 

因此,負載out_file成一個結構,然後從那裏訪問變量。

+0

謝謝,這絕對是一個不錯的主意。它也將使我的代碼更易於理解,因爲變量註釋是明確聲明的。 – Jenny

2

這是一個精美難懂的問題!這是Mathwork的糟糕設計。我甚至會把它稱爲一個bug,有趣的是看看他們是否同意。

簡短回答:您可以通過在您的代碼中的任意位置添加annnotation = 2;行來修復此問題,此代碼位於load(out_file);行以上。或者annotation = "roger";annotation = false;,只要您明確強制將其作爲您代碼中的變量,那麼使用哪種類型的變量進行註釋並不重要。

您寫的代碼沒有明確引用變量annotationannotation恰好是您加載到函數工作區的matlab文件中的一個變量的名稱。不知何故,這不會拋出運行時錯誤,它只是錯誤的,我會稱之爲錯誤,但matlab可能會說是一個記錄的限制。請參閱他們的文檔http://www.mathworks.com/help/techdoc/matlab_prog/f4-39683.html#f4-75258並告訴我您的想法。這個文檔似乎適用於嵌套函數,你的主要功能當然不是。 CLEARLY你的行other_function(annotation)應該看到annotationwhich annotation相同的範圍內,放置在它看到的正上方。 (我只是做了那個測試,它說annotation is a variable)。

這裏是一個很小的程序,顯示問題:

function test() 
    prepare('test.mat'); % writes i 
    load('test.mat'); % contains one variable named "annotation" 

    which annotation 
    other_function(annotation); 
end 

function prepare(filename) 
    annotation = 42; % the answer is 42 
    save(filename); 
end 

function other_function(poodle) 
    disp(poodle); 
end 

我邀請您使用頁面上的「報告錯誤」鏈接http://www.mathworks.com/support/bugreports提交這個bug報告!如果你不想,我會報告,只是讓我知道。

+0

謝謝你對如何解決這個問題的建議! 我同意你的說法,文檔只涉及嵌套和「在某些情況下」的匿名函數。此外,在最小的例子中,函數prepare是一個子函數,但是在我的原始代碼中,我發現這個問題,它甚至是一個主要函數。 我試着提交這個bug報告,但不幸的是 – Jenny

+0

我試着提交一個關於這方面的bug報告,但不幸的是,Mathworks網站不會讓我(之前有過這個問題,有一些與我的瀏覽器和cookie有關......) )。如果你能這樣做,這將是很好的,併發送給我鏈接,我可以跟蹤這個錯誤。 – Jenny

+0

我已提交[錯誤報告](http://www.mathworks.com/support/service_requests/Service_Request_Detail.do?ID=632255&filter=&sort=&statusorder=0&dateorder=0)。我的標題是**函數調用訪問函數,而不是局部變量。** – mwengler