图片缩略图

快速字符串转换的两倍

16.7版本1.8.0.0 (KB) 定量的家伙
str2doubleq将文本转换为双像Matlab的str2double,但是快400倍!多线程。
4所示。8
35评级

28下载

更新2012年10月10日

视图版本历史

查看许可协议

str2doubleq相当于Matlab内置str2double函数char或cellstr数组转换为适当的双阵列。内置str2double的缺点是,它变得非常缓慢,当数据集变得更大。

str2doubleq快速利用c++字符串处理功能。如果你有一个c++编译器支持新11标准或你有Boost库金宝app安装在你的电脑上,您可以使用多线程算法。多线程算法尺度数据集是否足够大。

函数编程作为str2double完全相同的行为。

原始需求的功能出现了某些市场数据解析的问题,必须做。现在Matlab可以尽快传统编程语言在这些类型的字符串解析问题。

安装:

* str2doubleq复制文件。cpp在硬盘驱动器。(例如C: \ Test \ str2doubleq.cpp)

*启动Matlab和编译源文件生成机器相关的二进制。如果你没有选择这一个编译器需要做第一(墨西哥人运行命令窗口中设置)。

*编译源输入墨西哥人< c源文件夹>
测试(例如墨西哥人C: \ \ str2doubleq.cpp)

*把str2doubleq生成。mexw32(32位)或str2doubleq。墨西哥人w64 (64-bit) to Matlab's scope (set path- folder group)

*如果你想提高性能,然后从str2doubleq取消注释行35。cpp(包含# define USE_PARALLEL_ALGORITHM)。记住,你需要有足够的现代编译器或提高(http://www.boost.org/安装)。

现在您可以使用函数在正常matlab时尚。test_str_to_double_performance运行的测试脚本。(包含在压缩文件)

引用作为

定量的家伙(2021)。快速字符串转换的两倍(//www.tatmou.com/matlabcentral/fileexchange/28893-fast-string-to-double-conversion), MATLAB中央文件交换。检索

评论和评级(49)

PL.R

惊人的。很棒的代码,加快字符串做双转换。我的代码运行快98%,比str2double str2doubleq

大卫Sanz

撒母耳Kreuzer

托马斯·约翰逊

路加福音肖

托马斯McFadyen

对于简单的数字,需要调整与银行合作虽然风格数字字符串“1000000”“- > 0而不是1000000

将Feavyour

一帆么

Michael Kaiser

优秀的提交;多年来我一直在使用这个!
最近,我注意到一个内存泄漏。在> 8000循环读取和转换1000000值,我看到进步的内存利用率增加。约为4000循环,内存使用超过256 GB !我有一个简单的测试用例说明这个问题。

TestStr2doubleqMemLeak()函数

% 16 may2018, Michael Kaiser一家普罗维登斯RI, kaiser@nabsys.com
%检测内存泄漏在墨西哥人函数str2doubleq ()。
%除了内存数据打印通过这个程序,监控内存使用Matlab
%在窗口任务管理器或OSX活动监视器
%
%墨西哥人编译:
% OSX: XCode 9.2版
% Win64:微软Visual Studio 2015

%为常见的模块路径
(MyPath, ~, ~) = fileparts (mfilename (' fullpath '));
如果~ isdeployed
Str2DoubleQDir = fullfile (MyPath ' / str2doubleq。');
目录(Str2DoubleQDir);
结束

%的输入
VectorSize = 1 e6;
NumLoops = 50;

%做一些循环变化和计算手段利用str2doubleq的输出。
%,以防止代码优化optimizing-out str2doubleq
意味着= 0 (NumLoops, 1);
MaxCircShift =地板(VectorSize / 10);

%建立随机向量的整数转换为字符串单元阵列
Vec1 =圆(1000 *兰德(VectorSize 1));
Vec1Str = cellstr (num2str (Vec1, 0));

如果ismac
[InitialFreeMem, ~, InitialMatlabMem] = OSXMemory ();
elseif ispc
PCMem =内存();
InitialMatlabMem = PCMem.MemUsedMATLAB / 1 e6;
InitialFreeMem = PCMem.MemAvailableAllArrays / 1 e6;
结束

2 = 1:NumLoops

CircShift =圆(MaxCircShift * rand ());
Vec1Dbl = str2doubleq (circshift (Vec1Str circshift));

意味着(ii) =意味着(Vec1Dbl (1: MaxCircShift));

如果ismac
[PresentFreeMem, ~, PresentMatlabMem] = OSXMemory ();
elseif ispc
PCMem =内存();
PresentMatlabMem = PCMem.MemUsedMATLAB / 1 e6;
PresentFreeMem = PCMem.MemAvailableAllArrays / 1 e6;
结束

如果ismac | | ispc
MemUsed = PresentMatlabMem - InitialMatlabMem;
MemUsed2 = InitialFreeMem - PresentFreeMem;
流('循环:% 6 d, Mem使用str2doubleq: % 12.3 f兆字节,% 12.3 f兆字节\ n ', ii, MemUsed, MemUsed2);
结束

结束% 2 = 1:NumLoops

% MakeUniquelyRemapped_CMD结束

函数(内存管理、TotalMem MatlabMem] = OSXMemory ()
%
% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
%描述:返回OSX系统的内存使用。
% Matlab '记忆'命令只适用于windows系统。
%这个函数使用一个UNIX命令来确定记忆的粘稠液体。
%如果windows操作系统,所有的内存值报告为零。
%
% - - - - - - - - - - - SVN文件信息- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%
%的输入:
%没有
%
%的回报(mb内存,):
%内存管理:释放内存(通常是Matlab可以使用的)
% TotalMem:总系统内存
matlab_helper % MatlabMem:内存使用的过程
% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
%

%确定操作系统不是窗户。如果是,返回所有结果= 0。
%扩大后可以使用windows“记忆”功能使这个操作系统
%的独立。
如果ispc
内存管理= 0;TotalMem = 0; MatlabMem = 0;
返回
结束

%在mb返回结果
单位= 1 e6;

%使用UNIX vm_stat空闲内存
% vm_stat报告的页面数量为4096字节
(~ m] = unix (“vm_stat | grep免费”);
sploc = strfind (m, ' ');
内存管理= str2double (m (sploc(结束):结束))* 4096 /单位;

%使用UNIX sysctl总内存大小
(~ m] = unix (sysctl hw。内存大小|切- d: - f2);
TotalMem = str2double (m) /单位;

%使用UNIX ps matlab_helper进程所使用的内存
%的父进程id
[~,ppid] = unix ([' ps - p $ ppid - l | ' awkCol (ppid)]);
ppid = KillExtraLines (ppid);

%得到父进程所使用的内存(驻留集大小)
unix ([[~, thisused] = ' ps rss - p - o ' strtrim (ppid)”| awk NR > 1 {print $ 2}”的]);
thisused = KillExtraLines (thisused);

% rss kB,转换为字节
thisused = str2double (thisused) * 1024;
MatlabMem = thisused /单位;

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%一个漂亮的小UNIX awk字符串来选择所需的列
%的响应
函数s = awkCol (colname)
s = [awk”{如果(NR = = 1) (i = 1;我< = NF; + +){如果我~ /‘colname / ($) {colnum =我;打破}}其他打印$ colnum} ");

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
%如果有任何附加在UNIX响应文本行,删除它们。
%只返回响应的最后一行。
%如dyld: DYLD_环境变量被忽略,因为主要可执行文件(/ bin / ps)是setuid和setgid
函数s = KillExtraLines (iStr)
EOLChar = 10;
lfloc = strfind (iStr char (EOLChar));
如果元素个数(lfloc) > 1
s = iStr (lfloc (end-1):结束);
其他的
s = iStr;
结束

罗伊Bijster

瑞安

Stevan威廉姆斯

加快str2double转换了10倍。
感谢这!

Stevan威廉姆斯

米甲Kvasnicka

串行版本可以简单地编译墨西哥人没有任何问题,但是我有一些严重的问题编制str2doubleq并行算法。我在使用Boost自由1.58.0 Ubuntu 16.04.2。任何帮助吗? ? ?

> >墨西哥人str2doubleq.cpp
建筑“g++”。
警告:你正在使用5.4.0的gcc版本。不支持的gcc版本。金宝app墨西哥人的目前版本支持是“4.9.x”。金宝app对于一个
目前支持列表编译器:金宝app//www.tatmou.com/金宝appsupport/compilers/current_release
错误使用墨西哥人
/ tmp / mex_644022341605952_2613 / str2doubleq。o:在函数“mexFunction”:
str2doubleq.cpp:(。text + 0 x993):未定义的引用的vtable boost::细节::thread_data_base”
str2doubleq.cpp:(。text + 0 xfaa):未定义的引用的线程boost:::: start_thread_noexcept ()”
str2doubleq.cpp:(。text + 0 x1061):未定义的引用的线程boost:::: native_handle ()”
str2doubleq.cpp:(。text + 0 x10a3):未定义的引用的线程boost:::: join_noexcept ()”
str2doubleq.cpp:(。text + 0 x10dd):未定义的引用的boost::线程:分离()”
/ tmp / mex_644022341605952_2613 / str2doubleq。o:在函数“_GLOBAL__sub_I_str2doubleq.cpp”:
str2doubleq.cpp:(。text + 0 x12b4):未定义的引用的系统boost:::: generic_category ()”
str2doubleq.cpp:(。text + 0 x12b9):未定义的引用的系统boost:::: generic_category ()”
str2doubleq.cpp:(。text + 0 x12be):未定义的引用的系统boost:::: system_category ()”
str2doubleq.cpp:(。text + 0 x12e9):未定义的引用的线程boost:::: hardware_concurrency ()”
/ tmp / mex_644022341605952_2613 / str2doubleq。o:函数的详细boost:::: thread_data < boost:: _bi:: bind_t <空虚,空虚(*)(mxArray_tag const *,
双*,双*,无符号长,无符号长),boost:: _bi: list5 < boost:: _bi:: < mxArray_tag const * >价值,提升::_bi::价值<双* >,
boost:: _bi:价值<双* >,boost:: _bi:价值<无符号长>,boost:: _bi:价值<无符号长> > > >::~ thread_data ()”:
str2doubleq.cpp:(.text._ZN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEED2Ev [_ZN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEED5Ev] + 0 * 13):
未定义的引用的详细boost:::: thread_data_base:: ~ thread_data_base ()”
/ tmp / mex_644022341605952_2613 / str2doubleq。o:函数的详细boost:::: thread_data < boost:: _bi:: bind_t <空虚,空虚(*)(mxArray_tag const *,
双*,双*,无符号长,无符号长),boost:: _bi: list5 < boost:: _bi:: < mxArray_tag const * >价值,提升::_bi::价值<双* >,
boost:: _bi:价值<双* >,boost:: _bi:价值<无符号长>,boost:: _bi:价值<无符号长> > > >::~ thread_data ()”:
str2doubleq.cpp:(.text._ZN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEED0Ev [_ZN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEED5Ev] + 0 x1b):
未定义的引用的详细boost:::: thread_data_base:: ~ thread_data_base ()”
/ tmp / mex_644022341605952_2613 / str2doubleq。o:函数的boost:: thread_exception: thread_exception (int, const char *):
str2doubleq.cpp:(.text._ZN5boost16thread_exceptionC2EiPKc [_ZN5boost16thread_exceptionC5EiPKc] + 0 x15):未定义的引用
boost::系统:system_category ()”
/ tmp / mex_644022341605952_2613 str2doubleq.o:(.data.rel.ro._ZTIN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEEE [_ZTIN5boost6detail11thread_dataINS_3_bi6bind_tIvPFvPK11mxArray_tagPdS7_mmENS2_5list5INS2_5valueIS6_EENSB_IS7_EESD_NSB_ImEESE_EEEEEE] + 0 x10):
未定义的引用的typeinfo提高:细节::thread_data_base”
collect2:错误:ld返回1退出状态

杰克O ' brien

伟大的工作,我得到了一个巨大的性能提升将基因组的位置!

juanmcloaiza

伟大的伟大的伟大!
在第69行,“如果(!)”应该被“如果(!年代| | is_null_or_blank (s))”?
我做了更换,因为空白字符串被解析为' 0 '……现在给我所有nan我很期待。
一个真正伟大的功能的人,感谢分享!

苏律

太棒了!

Sarmad乔杜里

Jose m . Requena全

减少了我的脚本时间从12.8秒到1.2秒。太棒了! !

爱德华·珀金斯

User12399

3所示。性能更高的实际()缠绕在str2doubleq O。o wtf ?

User12399

1。因为我使用输出一些数字转换为逻辑值和MATLAB不会允许复杂的双打,我不得不使用真正的缠绕在str2doubleq ()
当然没有投诉。只提及它,以防有人遇到这个问题,太

2。我跑的评价函数连续incriease输入时间后数次注意到我没有得到任何性能增加脚本。
这是有趣的:inputsizes 2和5的性能“仅仅”2 x或更少。
性能> 10倍后踢inputSize > 6

但就像船桨的家伙说,str2doubleq是专为大型数组。

他PINROJ

彼得·弗雷泽

由于一百万年。我最初的文件解析时间从20秒下降到2秒。

阿图罗Moncada-Torres

h . Homann

worden235

英格丽。

我感到厌烦等待str2double(重复调用导致15 19的年代我的代码需要的是花在str2double !)这是减少到0.093秒,这个函数现在只有少量等待3秒,谢谢

马修·甘恩

@Jonathan
我认为你是对的。一个出租汽车司机改变调用mxArrayToString修复。

char * freeme = mxArrayToString (mxStr);
const char * s = freeme;

mxFree (freeme)

代码修改指针,所以叫mxFree年代导致段错误!这个小舞被周围。

马修·甘恩

对于任何需要str2doubleq返回南而不是0当呼吁一个空字符串(如。str2doubleq(")),您可以添加:
如果(!(*))返回false;

在函数parse_to_double后线”如果(!)返回false;“

乔纳森

在进一步测试,这个函数泄漏大量的内存。函数调用mxArrayToString(),但不叫mxFree(),要求释放分配的内存数组。在任何时间,重复调用迅速超过我的机器的72 gb的RAM。

乔纳森

当定量的家伙说这是快于Matlab str2double,他不是在开玩笑! ! !

克利斯朵夫Trefois

@Matthias,

这是伊斯雷尔的设计功能。

从医生,:
如果有一个存储的虚部值0,伊斯雷尔()返回逻辑0(假)。

然而你可能期望返回的数字是不复杂时,虚部等于0。

1月

这个想法很好,但结果并不可靠。我不建议使用这种富有成效的工作。公正的评级并不容易在这种情况下,因此我现在犹豫了多年。

马蒂亚斯

你好,罗莉,
仍有一些差异
伊斯雷尔(str2doubleq(1) % 0,而不是1
str2double (2.236) -str2doubleq(2.236) %不为0(“2.235”很好)
str2double (1,1) -str2doubleq(1,1) % 9, 9而不是0

马蒂亚斯

@Lauri,好的工作……
仍然需要一些微调的功能:
str2doubleq(") %南而不是0

Zhibo

这将是极好的如果你可以解决内存泄漏问题提到的抢劫,造成通过调用“mxArrayToString”不叫“mxFree”来释放内存。

1月

@Lauri:一个优秀的加速!感谢更新。
我建议一行程序的主要时间在纯米(这看起来就不那么神秘扩大3行)时由SPRINTF浪费。使用CStr2String(见我的FEX页)一个更聪明的预先分配允许更快的长字符串的创建。这是你str2doubleq低于20%。

不是很奇怪,你的解析速度比ATOF或STRTOD吗?编译器制造商藏在他们实现什么?优秀的和快速解析Google的V8引擎是值得检查:http://code.google.com/p/double-conversion。舍入处理问题聪明可靠,什么是非常困难和复杂的工作。

需要一些微调的功能:
str2doubleq(正)%南而不是正无穷
str2doubleq (.i5) % 5而不是南
str2doubleq(“我”)% 0而不是0 + 1我
str2doubleq (1 e1.4) % 0.4而不是南
str2doubleq(- 1) % 1而不是南
s = ' 12345678901234567890 ';
str2doubleq (s) - str2double (s) % 2048
s = ' 123.123 e40 ';
str2doubleq (s) - str2double e26 (s) % 1.547

Mal-formed输入是一个邪恶的测试,我知道。但它会很好,如果你的非常有效的实现将Matlab的STR2DOUBLE一样可靠。

Zhibo

修改105行
dval * =战俘(exp);
似乎工作。伟大的工作,再次感谢!

Zhibo

感谢非常有用的实用工具将大量的文本转换成双阵列;然而,持续了(2012年10月06)提交工作输入不像“str2doubleq (123.45 e7)”。

定量的家伙

我提交新版本的函数算法更有效和更简洁的代码。

我认为新版本(审查过程之后)是最优的方式字符串双转换可以在任何情况下完成。性能上升从大约20 x 80 x - 100 x !

也为简:新版本远远超过你(的)一个衬!

1月

我还是想强调,:
Num =重塑(sscanf (sprintf (% s #,装运箱{:}),% g #),大小(装运箱))
约为2.4倍C-mex方法。我认为这是令人惊讶的,因为大型字符串的创建需要大量的临时内存。显然Matlab SSCANF非常快。我猜,它避免了耗时的转换从mxChar char。我们也可以在C !

只要一行程序在Matlab更快,我不觉得这提交有用的。
但它写好,该方法是合理的。因此我不给较低的评级。

Matlab2010

要搞清楚啊,为一个字符串< 130字符,str2double更快。

Matlab2010

根据剥夺了上面的建议:

/ / X = STR2DOUBLEQ (S)将字符串转换为年代,这应该是一个
/ / ASCII字符表示的真正价值,MATLAB的两倍
/ /表示。字符串可以包含数字,小数点,
/ / +或-领先的标志和“e”前10的幂比例因子
/ /
/ / X = STR2DOUBLEQ (C)将字符串转换为字符串单元阵列的C
/ /增加一倍。返回的矩阵X将c .南一样的大小
/ /返回的任何细胞不是代表一个有效的字符串
/ /标量值。南将返回单个细胞在C中
/ /单元格数组。

/ /实例
/ / str2doubleq (123.45 e7)
/ / str2doubleq (“3.14159”)
/ / str2doubleq ({“2.71”“3.1415”})
/ / str2doubleq ({“2.71”“3.1415”;“abc”、“123.45 e7})

/ /注意ATOF:
/ /得到终极性能c函数atof具有最优性能
/ /只是一个警告:atof在情况下的行为不同
/ /不能解释为字符串相同的感觉matlab str2double
/ /例如输入“2.2”产生双号2.2。
/ /当你知道你输入总是resembeles真正的数值,它是使用atof“安全”。
/ /这是当你的例子使用regexp来捕获总是令牌
/ /数字形式,通过建设e。g (\ d +)

# include“mex.h”
# include <字符串>
# include < sstream >

双string_to_double (const char *)
{
/ /如果你取消这个,使这个函数中的代码的其余部分
/ /评论。请参阅上面的注意关于atof使用。
/ /返回atof(年代);

静态std:: istringstream空间站;
iss.clear ();iss.str(年代);
双x;
国际空间站x > >;
如果(!(iss & & (iss > > std:: ws) .eof ()))
{
返回mxGetNaN ();
}
返回x;
}

空白mexFunction (int nlhs mxArray * plhs [],
int nrhs, const mxArray * prhs [])

{
双* writePtr;
char * strPtr;

如果(nrhs = = 0)
{
mexErrMsgTxt(“输入参数太少”);
}
else if (nrhs > = 2)
{
mexErrMsgTxt(“输入参数太多了。”);
}
如果(mxIsChar (prhs [0]))
{
/ /处理字符的分支
/ /指针指向char的开始
strPtr = mxArrayToString (prhs [0]);
/ /输出分配内存
plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL);
/ /设置指针指向的内存的开始
writePtr = mxGetPr (plhs [0]);

* (writePtr) = string_to_double (strPtr);
mxFree (strPtr);
}
else if (mxIsCell (prhs [0]))
{

mwSize mrows ncols,我;
mrows = mxGetM (prhs [0]);
ncols = mxGetN (prhs [0]);
/ /分配内存的结果
plhs [0] = mxCreateDoubleMatrix (mrows、ncols mxREAL);

writePtr = mxGetPr (plhs [0]);
/ /获取指针数组的开始

(我= 0;我< mrows * ncols;我+ +)
{
mxArray *上下文= mxGetCell (prhs [0], i);
如果(上下文= = 0 | | ! mxIsChar(上下文)
{
* (writePtr + i) = mxGetNaN ();
}
其他的
{
char * strPtr = mxArrayToString(上下文);
如果(strPtr ! = 0)
{
* (writePtr + i) = string_to_double (strPtr);
}
其他的
{
* (writePtr + i) = mxGetNaN ();
}
mxFree (strPtr);
}
}
}
else if (mxIsDouble (prhs [0]))
{
/ /返回NaN的向量
mwSize mrows ncols,我;
mrows = mxGetM (prhs [0]);
ncols = mxGetN (prhs [0]);
如果(mrows = = 0 & & ncols = = 0)
{
/ /如果输入是空数组必须返回NaN值
mrows = 1;ncols = 1;
}
plhs [0] = mxCreateDoubleMatrix (mrows、ncols mxREAL);
writePtr = mxGetPr (plhs [0]);
(我= 0;我< mrows * ncols;我+ +)
{
* (writePtr + i) = mxGetNaN ();
}
}
其他的
{
/ /案件处理其他情况,如输入是一个类等....
/ /输出分配内存
plhs [0] = mxCreateDoubleMatrix (1, 1, mxREAL);
/ /指针分配内存的开始
writePtr = mxGetPr (plhs [0]);
/ /写南的第一个元素
writePtr [0] = mxGetNaN ();
}
};

罗伯·埃瓦尔德

优秀的实用程序,谢谢!
然而,频繁调用“str2doubleq”显示内存泄漏:

“mxArrayToString”不自由动态字符指针指向的内存。因此,你应该通常免费字符串(使用mxFree)完成后立即使用它:
http://amath.colorado.edu/computing/Matlab/OldTechDocs/apiref/mxarraytostring.html

代码功能2调用“mxArrayToString”(第98、68行)。
添加声明“mxFree (strPtr);“在75年和107年行和重新编译解决了泄漏。

我们读书的时候,偶然发现了这150.000线的ASCII文件,称“str2doubleq”:每一行大力排水MATLAB的可用内存。

现在工作很好,再次感谢这种高度有用的程序。

布莱恩金刚砂

超过一个数量级的速度!非常有用的阅读大量的文本。明确的指示。谢谢你发帖!

1月

一些进一步的测试与其他解析器程序:
strtod: 0.13秒
sscanf: 0.16秒

另一个评论:“str2double (2.7 i - 3 - 14)”是令人困惑的一个例子:这并不与str2doubleq工作。

1月

好主意,快。因此,它是非常有用的。

一些评论:
1。不要使用你的函数的示例,但Matlab STR2DOUBLE。
2。你为什么把双作为输入不同于其他无效输入:= > NaN-matrix两倍,单= >标量南?
3所示。调用的函数没有初始化细胞元素导致空指针异常:str2double(细胞(1、3))。奇怪,但它有助于检查NULL mxGetCell后。
4所示。转换从mxChar (unicode) c浪费时间。有一个c++函数,解析一个Unicode字符串也?
5。请提及在帮助部分,输入二维细胞>回复一个矩阵。或函数维数相同的回复一个数组作为输入单元。
6。str2doubleq(正)南回答。
7所示。如果你限制输入的值,你可以以不同的方式解析细胞字符串:
d =重塑(sscanf (sprintf (“% s #”, c {:}), % g #),大小(c));
细胞为{1 x 1000}字符串由sprintf (' %。15克,兰德)我得到这些计时Matlab2009a, 1.5 ghz PentiumM:
STR2DOUBLE: 2.03秒
STR2DOUBLEQ: 0.44秒
SSCANF (SPRINTF): 0.13秒
如果你让CStr2String创建长字符串,它只需要0.06秒。令人惊讶的!你的函数看起来更有效看代码。所以我认为,我的istringstream MSVC2008必须是沉船。我将尝试使用旧sscanf C。

MATLAB版本兼容性
创建R2010b
兼容任何释放
平台的兼容性
窗户 macOS Linux

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!