Matlab 3D矩阵的线性索引:将前2个DIM扩展为向量的最佳方法(标量上的慢速sprintf)

Matlab 3D矩阵的线性索引:将前2个DIM扩展为向量的最佳方法(标量上的慢速sprintf),matlab,printf,Matlab,Printf,我有一个3D向量s1(nmax、mmax、ntimeSTEPS)。我想在每个时间步j(即第三维度的每个值)获取前两维度的所有元素,并获得一个向量,以提供给sprintf。然而,sprintf如果在一个周期内,速度会非常慢!我查看了手册,似乎没有办法直接使用线性索引来实现这一点。还是我遗漏了什么?我只能考虑使用重塑,但是像s1(:,j)这样的东西将是最好的,但这不是MATLAB的工作方式。我做到了: nmax = 800; mmax =400; nm

我有一个3D向量
s1
(nmax、mmax、ntimeSTEPS)。我想在每个时间步
j
(即第三维度的每个值)获取前两维度的所有元素,并获得一个向量,以提供给
sprintf
。然而,
sprintf
如果在一个周期内,速度会非常慢!我查看了手册,似乎没有办法直接使用线性索引来实现这一点。还是我遗漏了什么?我只能考虑使用
重塑
,但是像
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秒!我正在尝试做一个动画,这是疯狂的缓慢。如果我增加数组的大小,它基本上会卡住。 对使用线性索引有什么建议吗?

试试这个

for idx = 1:numel(s1)
    charINPUT{idx} = sprintf('%6.3f',s1(idx));    
end
使用
sprintf
sprintf
可以获取一个数组。使用换行符输出,并使用
regexp
解析数字并将其放入字符串单元格数组中

charINPUT = regexp(sprintf('%6.3f\n',s1(:)),'(?<=\s*)(\S*)(?=\n)','match')
您可以完全跳过
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

我不确定第一种选择是否可行。我打开了函数num2str,它正在调用convertUsingRecycledSprintf,它在列索引上做一个循环…所以你不能避免循环加上CALL的重载。我考虑了第二个选项,但它涉及额外的和和和乘法…这里仍然重载。我尽量优化,因为每次都需要半分钟(巨大的矩阵)好吧,你也可以用数组运行
sprintf
sprintf(“%6.3f\n”,s1(:)重点是,对不起,也许我没有指定,我编辑了这篇文章,但是当你提到时间循环时,你通常会做一些时变的绘图,每次我在2D绘图上绘制这些文本标签时,这些东西都非常清晰。所以我只需要每个时间步的前两个维度。好吧,你是伟大的regexp!它比那快6.1倍!我可以编辑你的文章,复制并粘贴你的解决方案应用到我的文章中吗?这样,这是最好的答案。如果不存储额外的变量,仍然没有线性索引,我会在你的答案上写上,我想没有办法。你可以使用
sprintf
regexp
在一行中获取你需要的单元格。请看我的答案。请记住,您可以读取具有单个索引的二维(或三维)数组,而无需重新调整其形状。(你可以去掉
重塑
命令,得到同样的结果,你可以像Alexandre建议的那样使用一个循环。)我有一个无循环的解决方案只是为了好玩。它会的。嵌套循环也会做同样的事情。你甚至不需要重塑。不,它不起作用,你需要2个嵌套的do循环。我试过了,除非我错过了什么
for j=1:ntimeSTEPS,
    stepInds = (1:nmax*nmax) + (j-1)*nmax*nmax;
    charINPUT = cellstr(num2str(s1(stepInds),'%6.3f'))
end