1

我有一个 3D 向量s1(nmax,mmax,ntimeSTEPS)。我想在每个时间步j(即第三维的每个值)取前两个维度的所有元素并获得一个向量来给出sprintf。但是,sprintf如果在一个循环内,会非常缓慢!我检查了手册,看起来没有办法直接使用线性索引来做到这一点。还是我错过了什么?我只能想到使用reshape,但类似的东西s1(:,j)会是最重要的,但这不是 MATLAB 的工作方式。我做了:

        nmax = 800;
        mmax =400;
        nmax_x_mmax = nmax*mmax;
        ntimeSTEPS = 1;
        charINPUT = cell(nmax_x_mmax,1);
        s1 = ones(nmax,mmax,ntimeSTEPS)*1234;
        tic
        for j=1:ntimeSTEPS
            %... other stuff
            input=reshape(s1(:,:,j),nmax_x_mmax,1);
            for kk=1:length(input)
                charINPUT{kk} = sprintf('%6.3f',input(kk));
            end
            %... other stuff  (collecting movie frames etc)
        end
        toc

在我的 i7 2.2 GHz 上,这一步需要 5.09 秒!我正在尝试制作动画,这非常慢。如果我增加数组的大小,它基本上会卡住。对使用线性索引执行此操作有什么建议吗?

4

2 回答 2

2

使用sprintf

sprintf可以带一个数组。输出换行符并用于regexp解析数字并将它们放入字符串单元格数组中。

charINPUT = regexp(sprintf('%6.3f\n',s1(:)),'(?<=\s*)(\S*)(?=\n)','match')

没有sprintf

您不必sprintf在循环中使用来构建字符串元胞数组。由于num2str采用格式说明符,因此您可以对整个事情执行此操作:

charINPUT = cellstr(num2str(s1(:),'%6.3f'))

您可以完全跳过循环ntimeSTEPS,或者如果您正在执行其他未显示需要循环的操作,您可以按如下方式处理索引。

对于s1没有临时变量的直接索引,您可以通过自己计算线性索引(1:nmax*nmax) + (j-1)*nmax*nmax

for j=1:ntimeSTEPS,
    stepInds = (1:nmax*nmax) + (j-1)*nmax*nmax;
    charINPUT = cellstr(num2str(s1(stepInds),'%6.3f'))
end
于 2013-10-04T17:16:33.453 回答
0

尝试这个

for idx = 1:numel(s1)
    charINPUT{idx} = sprintf('%6.3f',s1(idx));    
end
于 2013-10-04T16:41:21.733 回答