0

for ループ内でその配列に単一の列をアタッチして、配列を作成しようとしています。最初にゼロの列を初期化し、読み取った新しい列を更新されたベクトルの右側に配置することでそれを行っています。しかし残念なことに、これは部分的にしか機能せず、制限を設けた後でなければ機能しません。つまり、新しい各ベクトルの最初の - たとえば - 500 行のみを保持します。

問題の次の解決策については、まず、このゼロ列ベクトルが最後の配列に表示されない理由がわかりません! もう 1 つの問題は、最終的な配列の合計列数は最初からわかっていても、個々の列の実際の行数がわからない場合があることです。実際には、最終的な配列のデフォルトの行数として、添付される異なる単一の列の中でより大きな行数を考慮したいので、ベストプラクティスは列の整数に実行することであると思いますより大きな行数を決定し、最初の配列の適切な次元を設定して単一の列データで埋め、最後に後者のデータに基づいて最初のものを埋めます。

どんな提案でも大歓迎です!

data = zeros(500,1);
for symbol = 1:length(symbol_list),
    [hist_data] = retrieve_data(symbol_list(symbol));
    data = [data hist_data(1:500)];
end

編集:

入力/出力の例を挙げましょう。

次の 3 つの列を配置したい (各反復でそのうちの 1 つを取得します)

0.402513860949959   0.401546899405730   0.405949059210334
0.401396441661866   0.400288848738267   0.403936753893693
0.400862023741474   0.402233108860710   0.404473368644797
0.411161714570851   0.413612748989126   0.409437055092511
0                   0.414870799656589   0.415071509979105
0                   0.416586323294039   0

1 つが隣り合って、最終的に次の表になります (行数が大きいが同じ数のものだけを保持します。したがって、ここでは 2 番目の列のみを保持します)。

0.401546899405730
0.400288848738267
0.402233108860710
0.413612748989126
0.414870799656589
0.416586323294039

言い換えれば、非常に多くの列を並べて接続したいということです。それらの大部分は、同じ長さの非常に大きな行を持っています。ただし、行の数 (長さ) が任意に小さいものもあります。この「大きな」数の行を見つけ、この「大きな」長さに対応する列のみを保持し、最終的に隣り合わせに配置します。

4

2 に答える 2

2

異なる行数の列を処理しているため、retrieve_data から取得したデータを格納するためにセル配列を使用する方がよいと思います。セル配列にすべてを集めた後でも、短い行をパディングするか、長い行をトリミングすることで、後で標準の行列に変換できます。

c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
sizesC = cellfun(@length,c)
% pad to maximal size with Nan's
for el=1:length(c)
    c{el}(sizesC(el)+1:max(sizesC))=NaN;
end
% Trim to minimal size
c={[1 2 3 4]',[2 43 5]', [1 2]' , [2 5 6 7 3]'}
for el=1:length(c)
    c{el}(min(sizesC)+1:end)=[];
end
% Convert rectangular cellarray to matrix
m=cell2mat(c)
于 2012-06-09T10:31:40.883 に答える
1

私はあなたの質問のほとんどに従ったかどうか確信が持てないので、これはあなたが尋ねた質問に対する答えではないかもしれません...

構築しようとしているデータ構造が実際には配列ではない場合、たとえば実際には長さが等しくないベクトルのリストである場合、単純な古い配列は Matlab で使用するのに最適なデータ構造ではない可能性があります。これは実際的な選択かもしれませんが、cell 配列の方が適切な選択かもしれません。

配列が適切または実用的な選択である場合、ループを一周するたびに新しい列を追加して配列を構築することは、経験豊富な Matlab ユーザーのほとんどから、非常に悪い考えであると一般的に考えられています。この方法で配列を構築すると、非常に時間がかかり、メモリの問題も発生する可能性があります。とにかくそれが一般的な考え方であり、誰もあなたにその考えに従うように強制するつもりはありません.

はるかに優れたアプローチは、配列を大きなチャンクに割り当てることです。理想的な (?) 状況では、次のようなステートメントを使用して、配列全体を一度に割り当てます。

data = zeros(500,462);

次に、ループ内の各列にデータを書き込みます。最終的に必要になる列の数がわからない場合は、十分な大きさの配列を作成してください。部屋が足りなくなったら、一度に N 列を追加し、ループを続けます。必要に応じて繰り返します。N の適切な選択は、問題とデータに大きく依存します。

(大きな) 配列を列ごと (または行ごと) に構築する理由は、Matlab で新しい列を追加するたびに:

  1. 新しい、より大きな配列用に十分な空きメモリを取得します。
  2. 古いメモリ位置から新しいメモリ位置に値をコピーします。
  3. 古いバージョンの配列が格納されていたメモリのブロックを空きメモリ プール (または Matlab が実際に呼び出しているもの) に返します。

これを繰り返し行うと、かなりの時間がかかる場合があります。また、過度のメモリ断片化が発生する可能性があります。プールに返されるメモリ ブロックはどれも、同じ配列の新しいバージョンに使用するのに十分な大きさではありません。メモリ使用のパターンを間違えると、新しい配列には小さすぎる解放されたブロックによってメモリが占​​有されることになりますが、あちこちの奇妙なスカラーに必要なものをはるかに超えています。これは確実というより確率ですが、ボックス内のすべてのバイトにデータを詰め込む場合に注意する価値があります。

于 2012-06-09T10:33:11.420 に答える