私はしばしば次のようなことをしていることに気づきました:
unprocessedData = fetchData(); % returns a vector of structs or objects
processedData = []; % will be full of structs or objects
for dataIdx = 1 : length(unprocessedData)
processedDatum = process(unprocessedData(dataIdx));
processedData = [processedData; processedDatum];
end
これは機能的ですが、最適ではありません -processedData
ベクターはループ内で成長しています。速度のために事前割り当てを検討する必要があることもmlint
警告しています。
データが のベクトルである場合、次のint8
ようにすることができます。
% preallocate processed data array to prevent growth in loop
processedData = zeros(length(unprocessedData), 1, 'int8');
連結するのではなく、ベクトル スロットを埋めるようにループを変更します。
後で構造体またはオブジェクトを保持できるように、ベクトルを事前に割り当てる方法はありますか?
更新: Azim の回答に触発されて、ループの順序を単純に逆にしました。最後の要素を最初に処理すると、デバッガーが確認するように、最初のヒットでベクター全体の事前割り当てが強制されます。
unprocessedData = fetchData();
% note that processedData isn't declared outside the loop - this breaks
% it if it'll later hold non-numeric data. Instead we exploit matlab's
% odd scope rules which mean that processedData will outlive the loop
% inside which it is first referenced:
for dataIdx = length(unprocessedData) : -1 : 1
processedData(dataIdx) = process(unprocessedData(dataIdx));
end
これにはprocess()
、MATLABprocessedData
が実際のオブジェクトでの最初の書き込みで初期化するため、 によって返されるすべてのオブジェクトが有効な引数なしのコンストラクターを持っている必要があります。
mlint
配列の増加の可能性についてまだ不平を言っていますが、それは逆ループの反復を認識できないためだと思います...