2011-12-02 96 views
2

我的問題是標題。與mex函數相比,爲什麼matlab中的str2double非常慢?

  1. 爲什麼str2double在matlab中比在C/C++中製作的mex函數慢得多? matlab是否沒有良好的字符串處理能力?

  2. 誰能給我一些事實理由,爲什麼一個MEX函數運行幅度的這麼多訂單更快?我希望對這種差異做一個運行時間分析,但是我沒有任何matlab代碼的具體原因。

  3. 你能向我解釋,我怎麼會開到文件,實際上看的內置MATLAB str2double功能編寫的代碼?

的話題有些貼子:

http://www.mathworks.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion

我不明白的海報意味着什麼,當他們試圖解釋這功能更快速地運行。例如,這意味着什麼:(str2doubleq是C++中的mex函數)

「str2doubleq利用mex-gateway使用C++快速字符串處理功能和std :: stringstream屬性。在升壓:: lexical_cast的」

沒有人能回答這個用的?

回答

3

1)str2double是一個相當複雜的功能,它可以將許多不同的格式。我想你的mex實現更簡單,這可以解釋爲什麼它更快。索姆提供的例子在matlab幫助:

str2double('123.45e7') 
    str2double('123 + 45i') 
    str2double('3.14159') 
    str2double('2.7i - 3.14') 
    str2double({'2.71' '3.1415'}) 
    str2double('1,200.34') 

2)爲什麼mex更快?因爲當你執行一個標準的m文件腳本時,基本上有一個程序會讀你的程序並執行它(解釋器)。所以有兩層。但是,當您編寫mex文件時,您可以直接使用CPU語言編譯它,以便它可以由處理器直接運行。只有一層,所以速度更快。有關詳細信息,請參閱Wikipedia文章:

http://en.wikipedia.org/wiki/Interpreted_language

http://en.wikipedia.org/wiki/Compiled_language

3)你看不到的str2double的代碼,因爲它被編譯。 Matworks不提供此功能的代碼。你可以執行它,但不能讀取它。所有內置函數都是一樣的。

+0

但是,編譯時間並不會導致它運行緩慢,而是數據集的大小。你的第一個解釋似乎是相關的,但唯一失去的功能是程序不能解釋複數。另一方面,它有一些附加的功能,所以這兩個將取消。也許這是因爲matlab將字符串存儲爲向量,這是一種效率低下的方法嗎? – NONE

8

str2double執行不向你隱藏。要查看它,請鍵入edit str2doulbe.m。你也可以在你的代碼上運行profiler來查看函數中的所有時間。

綜觀功能,我的猜測是,它是緩慢的B/C sscanf被稱爲一個循環中。一個在您發佈使用下面的代碼建議利用sscanf的fileexchange鏈接評論者正在向量化:

d = reshape(sscanf(sprintf('%s#', c{:}), '%g#'), size(c)); 

這實際上比str2double一個單元陣列快得多。

+0

感謝您的快捷方式。我不需要文本解析的靈活性。這削減了我的整體運行時間大約一半。工作很好。 – EngrStudent

相關問題