Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么str2double在matlab中比mex函数慢?_C++_Matlab_Mex - Fatal编程技术网

C++ 为什么str2double在matlab中比mex函数慢?

C++ 为什么str2double在matlab中比mex函数慢?,c++,matlab,mex,C++,Matlab,Mex,我的问题是标题 为什么与C/C++中的mex函数相比,matlab中的str2double速度如此之慢?matlab只是没有很好的字符串处理能力吗 有谁能给我一些事实上的理由来解释为什么一个mex函数的运行速度要快这么多个数量级?我希望对这种差异进行运行时分析,但从matlab代码中我没有任何具体的原因 你能给我解释一下我将如何打开这个文件并实际查看为内置matlab str2double函数编写的代码吗 关于该主题的一些帖子: 当他们试图解释这个函数如何更快地运行时,我不理解海报的意思。例如

我的问题是标题

  • 为什么与C/C++中的mex函数相比,matlab中的str2double速度如此之慢?matlab只是没有很好的字符串处理能力吗

  • 有谁能给我一些事实上的理由来解释为什么一个mex函数的运行速度要快这么多个数量级?我希望对这种差异进行运行时分析,但从matlab代码中我没有任何具体的原因

  • 你能给我解释一下我将如何打开这个文件并实际查看为内置matlab str2double函数编写的代码吗

  • 关于该主题的一些帖子:

    当他们试图解释这个函数如何更快地运行时,我不理解海报的意思。例如,这意味着什么:(str2doubleq是用c++编写的mex函数)

    “Str2DouLeq利用MX网关使用C++快速字符串处理能力和STD::STRIGSTROW属性。转换使用的是Booo::LoCalic SkyCost”

    中使用的相同思想。 没有人能回答这个问题?

    1)str2double是一个非常复杂的函数,可以转换许多不同的格式。我想您的mex实现要简单得多,这可以解释为什么它更快。matlab帮助中提供了Som示例:

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


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

    str2double的实现不会对您隐藏。要查看它,请键入
    编辑str2doulbe.m
    。您还可以在代码上运行探查器,查看所有时间都花在函数中的什么位置

    看看这个函数,我的猜测是它很慢,在循环中调用b/c
    sscanf
    。您发布的fileexchange链接中的一位评论者建议使用以下代码来利用
    sscanf
    的矢量化优势:

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

    对于单元格数组来说,这实际上比str2double快得多。

    但导致它运行缓慢的不是编译时间,而是数据集的大小。您的第一个解释似乎很贴切,但唯一失去的功能是程序无法解释复数。另一方面,它有一些附加的功能,所以imo会将这两个功能取消。也许是因为matlab将字符串存储为向量,而这是一种效率低下的方法?谢谢你的快捷方式。我不需要文本解析的灵活性。这使我的总运行时间减少了大约一半。干得好。