以更有效的方式划分数据数组Matlab

时间:2017-02-02 13:48:54

标签: arrays matlab for-loop vectorization

我有大量数据(可能有数千和数万个值)。该数据是在一个阵列中收集的实验结果:

public class MainActivity extends AppCompatActivity {

  TextView txt;
  Thread thread;
  Runnable runnable = new Runnable() {
  @Override
  public void run() {
    txt.setText("bro");
  }
  };

  View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
     thread.start();
    }
  };

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txt = (TextView) findViewById(R.id.name_txt);
    thread = new Thread(runnable);
    txt.setOnClickListener(listener);
  }
}

我有相同大小的时间数组 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开始 - 它是2个实验的数据等。 我想做什么:按特定的时间间隔划分数据:

1

我走这条路

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

这很有效,但由于:

,因此速度很慢
  1. 我无法预先分配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. 使用part1 part2 part3 part4循环。
  3. 我们能以更优雅,更快捷的方式做到吗?

    现在我知道使用一个单元阵列而不是4个不同的单元阵列。现在我使用for。所以我可以预先将其分配为part{1} part{2} ... part{4}

1 个答案:

答案 0 :(得分:3)

您可以使用逻辑索引来改进代码。

我强烈建议您阅读以下参考资料:

以下代码使用逻辑索引来执行您想要的操作而无需任何循环,因此无需预先分配任何数组:

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

逻辑索引类似于红绿灯:它允许值为1的数组元素在停止那些值为0的元素时继续。

Matlab在这类任务中非常强大。