我有一个看起来像这样的向量:
y =
Columns 1 through 19:
1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2
Columns 20 through 38:
2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4
Columns 39 through 57:
4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 6
Columns 58 through 67:
6 6 6 6 6 6 6 6 6 6
向量y
始终从 1 开始并向上计数。你会看到有很多相同的数字。这是样本的类。
在这里,我们有1 1 1 1 1 1 1 1 1 1 1 1
= 12 个类别 1 的样本。
对于第 2 类,我们有2 2 2 2 2 2 2 2 2 2 2
= 11 个样本。
我的问题是我想为每节课找到开始和停止。例如:第 1 类始终从索引 0 开始,在本例中以索引 11 结束。
第 2 课在第 1 课结束后直接开始。
问题:
我正在使用 EJML(Effient Java Matrix Library)并且我打算使用这个函数:
C = A.extractMatrix(1,4,2,8)
这等于这个 MATLAB 代码:
C = A(2:4,3:8)
但我需要从这个y
向量中找到开始和停止索引。例如,第 3 类在什么索引中停止和启动?你有什么聪明的想法吗?
当然,我可以使用 for 循环来执行此操作,但 Java 中的 for 循环非常慢,因为我将有一个非常非常大的y
向量。
建议?
编辑:
这是一个建议。这很好,还是可以做得更好?
private void startStopIndex(SimpleMatrix y, int c, Integer[] startStop) {
int column = y.numCols();
startStop[0] = startStop[1] + 1; // Begin at the next class
for(int i = startStop[0]; i < column; i++) {
if(y.get(i) != c) {
break;
}else {
startStop[1] = i;
}
}
}
假设我们从以下位置调用该方法:
Integer[] startStop = new Integer[2];
for(int i = 0; i < c; i++) {
startStopIndex(y, c, startStop);
}