【问题标题】:Why is str2double so slow in matlab as compared to a mex-function?与 mex 函数相比,为什么 matlab 中的 str2double 这么慢?
【发布时间】:2011-12-02 21:49:09
【问题描述】:

我的问题是标题。

  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 属性。转换使用与 boost::lexical_cast 中使用的相同的想法"

没有人能回答这个问题?

【问题讨论】:

    标签: c++ matlab mex


    【解决方案1】:

    str2double 的实现不会对你隐藏。要查看它,请输入edit str2doulbe.m。您还可以在您的代码上运行分析器,以查看函数中的所有时间都花在了哪里。

    查看函数,我的猜测是它很慢 b/c sscanf 在循环内被调用。您发布的文件交换链接中的一位评论者建议使用以下代码来利用 sscanf 被矢量化:

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

    对于元胞数组,这实际上比 str2double 快得多。

    【讨论】:

    • 感谢您的快捷方式。我不需要文本解析的灵活性。这将我的整体运行时间减少了大约一半。干得好。
    【解决方案2】:

    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 语言编译它,这样它就可以直接由处理器运行。只有一层,所以速度更快。有关详细信息,请参阅维基百科文章:

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

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

    3) 你看不到 str2double 的代码,因为它是编译过的。 Matworks 没有提供这个函数的代码。您可以执行它,但不能读取它。这对所有内置函数都是一样的。

    【讨论】:

    • 但是导致它运行缓慢的不是编译时间,而是数据集的大小。您的第一个解释似乎是中肯的,但唯一丢失的功能是程序无法解释复数。另一方面,它具有一些附加功能,因此 imo 这两个会取消。也许是因为 matlab 将字符串存储为向量,这是一种低效的方法?
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 2012-05-05
    • 2011-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2020-11-25
    相关资源
    最近更新 更多