2011-12-02 13 views
2

私の質問はタイトルです。なぜmex-functionに比べてstr2doubleがmatlabで遅いのですか?

  1. なぜC/C++で行われたMEX関数と比較して、MATLABで関数str2doubleそう遅いですか? matlabには文字列処理機能がありませんか?

  2. mexの機能が何倍も速く動作するのか、誰にもわからないことがありますか?私はこの違いの実行時分析を行うことを望んでいたが、私はmatlabのコードから具体的な理由はありません。

  3. あなたは私がファイルを開いて、実際に組み込みのmatlab str2double関数用に書かれたコードをどのように見てくれますか?

トピックに関するいくつかの投稿:

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

私は彼らがこの機能をより迅速に実行する方法を説明しようとするとポスターが何を意味するのか理解していません。これはどういう意味ですか?(str2doubleqはC++で作られたmex関数です)

"str2doubleはmex-gatewayを使ってC++の高速文字列処理機能とstd :: stringstreamプロパティを利用しています。 boost :: 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-ファイルスクリプトを実行すると、基本的にプログラムを読み込んで実行するプログラム(インタープリタ)が存在するためです。したがって、2つのレイヤーがあります。しかし、mex-fileを書くときには、プロセッサによって直接実行できるように、mex-fileをCPU言語で直接コンパイルします。 1つのレイヤーしかないので、より速いです。詳細については、Wikipediaの記事を参照してください。

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

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

3)それがコンパイルされているので、あなたは関数str2doubleのコードを参照することはできません。 Matworksはこの関数のコードを提供しません。あなたはそれを実行することはできますが、それを読むことはできません。これはすべての組み込み関数で同じです。

+0

しかし、コンパイル時にすべてがゆっくりと実行されるのではなく、データセットのサイズです。あなたの最初の説明は適切だと思われましたが、機能が失われるのはプログラムが複素数を解釈できないということだけです。一方、いくつかの機能が追加されているので、これらの2つは相殺されます。おそらくそれはmatlabが文字列をベクトルとして格納するためです。これは非効率的な方法です。 – NONE

8

str2doubleの実装はあなたから隠されていません。確認するには、edit str2doulbe.mと入力してください。また、コード内でプロファイラを実行して、関数内のどこに時間が費やされているかを確認することもできます。

関数を見ると、遅いb/c sscanfがループ内で呼び出されていると思います。あなたが投稿fileexchangeリンクでのコメンターの一つはsscanfはベクトル化されているの利点を活用するには、次のコードを使用して提案:

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

これは、セル配列のためにはるかに高速str2doubleよりも実際にあります。

+0

ショートカットありがとう。私はテキストの解析に柔軟性は必要ありません。これにより、私の全体的な実行時間が約半分に短縮されました。よくやった。 – EngrStudent

関連する問題