C++ 为什么str2double在matlab中比mex函数慢?
我的问题是标题C++ 为什么str2double在matlab中比mex函数慢?,c++,matlab,mex,C++,Matlab,Mex,我的问题是标题 为什么与C/C++中的mex函数相比,matlab中的str2double速度如此之慢?matlab只是没有很好的字符串处理能力吗 有谁能给我一些事实上的理由来解释为什么一个mex函数的运行速度要快这么多个数量级?我希望对这种差异进行运行时分析,但从matlab代码中我没有任何具体的原因 你能给我解释一下我将如何打开这个文件并实际查看为内置matlab str2double函数编写的代码吗 关于该主题的一些帖子: 当他们试图解释这个函数如何更快地运行时,我不理解海报的意思。例如
“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/csscanf
。您发布的fileexchange链接中的一位评论者建议使用以下代码来利用sscanf
的矢量化优势:
d = reshape(sscanf(sprintf('%s#', c{:}), '%g#'), size(c));
对于单元格数组来说,这实际上比str2double快得多。但导致它运行缓慢的不是编译时间,而是数据集的大小。您的第一个解释似乎很贴切,但唯一失去的功能是程序无法解释复数。另一方面,它有一些附加的功能,所以imo会将这两个功能取消。也许是因为matlab将字符串存储为向量,而这是一种效率低下的方法?谢谢你的快捷方式。我不需要文本解析的灵活性。这使我的总运行时间减少了大约一半。干得好。