2017-02-02 9 views
0

私は大きなデータ配列を持っています(それは数千から数万の値になります)。このデータは、1列に集めた実験の結果である:より効率的な方法でデータ配列を分割するMatlab

data = [2.204000000000000 
    2.202000000000000 
    2.206000000000000 
    2.201000000000000 
    ... 
    ] 

と私は同じ大きさの時間配列tを持っている:

t = [1 2 3 ... 65 66 1 2 3 4 ... 72 73 1 2 3 ... 75]'; 

このtは、データが収集された時間です。だから、t = 1:66は - 最初の実験で、その後t値が再び1から始まります - それは私が何をしたいのか2実験のデータとなど です:特定の時間間隔で除算データ:私は行く

t<=1 
1<t<=4 
4<t<=6 
t>6 

  1. 私はpart1 part2 part3 part4を事前に割り当てることができません。完璧に動作しますが、それが原因で遅いです、このよう

    part1 = []; part2 = []; part3 = []; part4 = []; 
    for ii = 1: size(data,1) 
        if (t(ii)) <=1  % collect all data corresponds to t<=1 
         part1 = [part1; ii]; 
        elseif (t(ii) >1 && t(ii) <=4) 
         part2 = [part2; ii]; 
        elseif (t(ii) >4 && t(ii) <=6) 
         part3 = [part3; ii]; 
        else 
         part4 = [part4; ii]; 
        end 
    end 
    data1 = data(part1); 
    data2 = data(part2); 
    data3 = data(part3); 
    data4 = data(part4); 
    

    - 私はそのサイズを知らない。

  2. forループを使用しています。

私たちはよりエレガントで高速に対応できますか?


ここでは、4つの異なるセルアレイの代わりに1つのセルアレイを使用する考えがあります。今私はpart{1} part{2} ... part{4}を使用しています。したがって、事前に割り当てることができますpart = cell(4,1);

答えて

3

論理インデックスを使用してコードを改善することができます。


次のコード

は、私は強く以下の参考文献を読むことをお勧めします論理的な索引付けを使用して、ループを使用せずに任意の配列を事前に割り当てる必要はありません。

data1 = data(t <= 1); 
data2 = data((t > 1) && (t <= 4)); 
data3 = data((t > 4) && (t <= 6)); 
data4 = data(t > 6); 

論理インデックス付けは、交通信号灯のようである:それは0の値を有する元素の停止中1の値を持つ配列の要素を継続することを可能にします。

Matlabはこの種のタスクで非常に強力です。

+0

本当に、私はそれについて簡単に思っています:)簡単な解決策! 私が誤解していたのは、どこでもセル配列を使用していたからです(読みやすいように数値配列に置き換えています)。だから、この 't {1,1}(1:end)'などはちょうど私の目を捨てて、私はこれを見ることができません:)ありがとう! –

+1

@Mikhail_Samお使いのコードの簡略化されたバージョンを提供していただきありがとうございます。はい、あなたが言及したように、数値配列ではセル配列よりも少し難読化されていますが、両方でうまく機能します。私はあなたの役に立つかもしれないより興味深いリンクで私の答えを更新しました。乾杯! – codeaviator

関連する問題