У меня есть вектор, который выглядит так:
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
= 11 образцов для класса номер 2.
Моя проблема в том, что я хочу найти начало и конец для каждого класса. Например: класс 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-l oop, чтобы сделать это, но циклы for в Java работают довольно медленно, потому что я собираюсь иметь очень-очень большой вектор 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);
}