我有大量数据(可能有数千和数万个值)。该数据是在一个阵列中收集的实验结果:
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
这很有效,但由于:
,因此速度很慢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);
- 我不知道他们的身材; part1 part2 part3 part4
循环。我们能以更优雅,更快捷的方式做到吗?
现在我知道使用一个单元阵列而不是4个不同的单元阵列。现在我使用for
。所以我可以预先将其分配为part{1} part{2} ... part{4}
答案 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在这类任务中非常强大。