首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >matlab:用字符串分析加快循环速度

matlab:用字符串分析加快循环速度
EN

Stack Overflow用户
提问于 2017-04-25 13:32:20
回答 2查看 91关注 0票数 0

我有一个非常重要的csv文件,包含三列。现在,我希望尽快将这些列加载到matlab矩阵中。

现在我要做的是

代码语言:javascript
复制
    fid = fopen(inputfile, 'rt');
    g = textscan(fid,'%s','delimiter','\r\n');
    tdata = g{1};
    fclose(fid);
    
    results = zeros([numel(tdata)-4], 3);
    tic
    display('start reading data...');
    for r = 4:numel(tdata)
        if ~mod(r, 100) 
            display(['data row: ' num2str(r) ' / ' num2str(numel(tdata))]);
        end
        entries = strsplit(tdata{r}, ',');
        results(r-3,1) = str2double(strrep(entries{1},',', '.'));
        results(r-3,2) = str2double(strrep(entries{2},',', '.'));
        results(r-3,3) = str2double(strrep(entries{3},',', '.'));
    end

然而,对于20万行,这需要30秒的时间。这意味着每一行150 s。这真的很慢。parfor不接受该代码。

现在,我想知道是什么导致了for循环中的瓶颈,以及如何加快速度。

在这里,测量的时间:

str2double 578253拨打29.631s 斯特拉普利特192750电话13.388 s

编辑:该内容在文件中具有此结构

代码语言:javascript
复制
  0.000000,  -0.00271,   5394147
  0.000667,  -0.00271,   5394148
  0.001333,  -0.00271,   5394149
  0.002000,  -0.00271,   5394150
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-25 14:56:33

我认为通过不同的调用文本扫描可以得到很大的改进。

你这样做:

代码语言:javascript
复制
g = textscan(fid,'%s','delimiter','\r\n');

然后调用tdata = g{1};

如果文本扫描被正确调用,它应该已经拆分了所有的数据,并将其作为数字返回。

试试这个:

代码语言:javascript
复制
g=textscan(fid,'%f,%f,%f,'delimiter','\r\n')

它应该给出三个单元格数组,列中包含您的值。若要转换为矩阵,可以使用:

代码语言:javascript
复制
g=cell2mat(g)

我在0.12秒内输入了200 K行。

您的代码似乎有其他一些解决办法。从r=4开始,你似乎有3行你不想读的。所以打开后你可以打三次电话

代码语言:javascript
复制
[~] =fgetl(fid) 

进入你档案中有趣的部分。

您还首先用分隔符“,”分隔行。但用“.”代替“所有”。这不会有任何作用,所有的“,”已经消失了,因为他们被用作分隔器。

票数 1
EN

Stack Overflow用户

发布于 2017-04-25 14:20:36

如果你使用csvread,你不需要使用str2doublestrsplit,你说这是慢行.对csv来说可能更快。

您可以通过以下方式替换所有上述代码:

代码语言:javascript
复制
results = csvread(inputfile);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43612164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档