【发布时间】:2020-08-24 04:17:03
【问题描述】:
我有一个看起来像这样的向量:
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 循环来执行此操作,但 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);
}
【问题讨论】:
-
像
1 1 1 2 2 1 1这样的可能吗? (多次运行相同的编号)。1 1 3 3 4 4 4呢? (跳过的号码)。还有3 3 3 1 1 2 2 2? (未排序)。请尽可能说明问题 -
@LuisMendo 没有。总是如 1 1 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 8 8 8 8 8 8 8 8 8
-
我怀疑 for 循环会很慢,但是如果不循环数据就没有办法找到它。即使矩阵库具有执行此操作的函数,它也会在该函数内部循环。唯一的另一种方法是在生成或捕获数据时跟踪它发生变化的点。
-
所以:已排序,没有跳过数字?请将其包含在问题文本中
-
作为参考,Matlab 解决方案将是
starts = [1 find(diff(y))+1]; ends = [st(2:end)-1 numel(y)];(基于 1 的索引)
标签: java matlab matrix vector ejml