2009-02-26 13 views
4

MATLABで非数値ベクトルを事前に割り当てる方法はありますか?

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's answerからインスピレーションを得て、単純にループの順序を逆転させました。

これは、MATLABがprocessedDataを初期化してから、process()によって返されるオブジェクトに有効な0引数のコンストラクタが必要であることを前提としています実際のオブジェクトで最初にそれに書き込みます。

mlintは可能な配列の増加についてまだ不平を言っていますが、逆ループの反復を認識できないためだと思います...

答えて

3

あなたが構造processedDataのフィールドを知っているし、あなたはその長さを知っているので、一つの方法次のようになります。

unprocessedData = fetchData(); 
processedData = struct('field1', [], ... 
         'field2', []) % create the processed data struct 
processedData(length(unprocessedData)) = processedData(1); % create an array with the required length 
for dataIdx = 1:length(unprocessedData) 
    processedData(dataIdx) = process(unprocessedData(dataIdx)); 
end 

これはprocess機能はprocessedDataと同じフィールドを持つ構造体を返すことを想定しています。

4

Azim's answerに加えて、これを行うための別の方法はrepmatを使用している:

nElementsあなたは構造体またはオブジェクト配列でなければならない要素の数である
% Make a single structure element: 
processedData = struct('field1',[],'field2',[]); 
% Make an object: 
processedData = object_constructor(...); 
% Replicate data: 
processedData = repmat(processedData,1,nElements); 

注意:作成しているオブジェクトがhandle classから派生している場合は、オブジェクト自体をレプリケートせず、参照を処理するだけです。実装によっては、オブジェクトコンストラクタメソッドnElements回を呼び出さなければならない場合があります。

+0

+1これはrepmatが有用な状況の1つです。 – Azim

3

あなたは適切なサイズのstructにセル配列に渡すことができます。

processedData = struct('field1', cell(nElements, 1), 'field2', []); 

これは、セル配列と同じサイズの構造体配列を作成します。

+0

+1これは、構造体配列を作成するための良い選択肢です。特に、フィールドの塗りつぶしを行うデータのセル配列をすでに持っている場合に便利です。 – gnovice

関連する問題