2

私はこのコードを持っています(画像を巨大なマトリックスに読み込みます)

allImages = [];
for ii = 1 : n
    img = imread( fileNames{ii} );
    img = imresize( rgb2gray(img), [100 100] );
    allImages = cat(3, allImages, img ); % append image to huge matrix
end

Matlab は、ループallIamges内で成長することを警告するループの最後の行を示します。

それで、ここで大したことは何ですか?

4

1 に答える 1

6

それは大したことです。

正確さに関しては、コードは期待どおりに機能します。ここでの問題はパフォーマンスです。

舞台裏で何が起こっているのですか?

新しい画像が に追加されるとallImages、Matlab はサイズ変更されたallImages. これには通常、サイズ変更された の新しいメモリ割り当て、allImages古いデータのコピー、古いデータの割り当て解除が伴いallImagesます。
バックグラウンドで (おそらく各反復で) 発生するこれらの再割り当て + コピー操作は、非常に時間がかかる可能性があります。


何ができるでしょうか?

1. 事前割り当て: 画像の数と の最終的なサイズがわかっている場合はallImages、このスペースを事前に確保します。

allImages = zeros( 100, 100, n ); % pre-allocate, fill with zeros.
for ii = 1 : n
    % ...
    allImages(:,:, ii ) = img; % write into pre-allocated array
end

n2.事前にわからない場合はどうすればよいですか? : この問題については、すでにいくつかの質問があります。たとえば、この回答

于 2013-07-02T11:53:26.800 に答える