1

3D ベクトルs1(nmax、mmax、ntimeSTEPS) があります。各時間ステップj(つまり、3 番目の次元の各値) で、最初の 2 つの次元のすべての要素を取り、 に与えるベクトルを取得したいと考えてい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 では、1 回のステップで 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 に答える