在java中,如何展平多维数组,将其传递给激活函数,并以最有效的方式从响应数组中检索原始层次结构?
例如,原始数据块的格式为
输入数据结构:
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]
定义的激活函数可以一次性处理整个块,因此为了最大效率,我想以某种方式将其展平。 中间数据结构:
[.,.,.,.,.,.,. ... ]
然后,我想“解冻”响应,使其反映原始层次结构。
输出数据结构:
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]
假设激活功能按顺序处理,因此订单不会搞砸。 在Java中我可以实现相同的最快方式是什么?如果我使用数组,我不想保持扁平化和deflattening的索引。
答案 0 :(得分:0)
如果可以接受List
而不是数组,则可以将数组包装在List
中。
这实现了List
get
和set
,并且还实现了find
,以便您可以发现特定索引处的元素应该出现在数组中的哪个位置。
static class Point {
final int x, y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
static class Flattened<T> extends AbstractList<T> implements List<T> {
private final T[][] subject;
private final int flattenedLength;
public Flattened(T[][] subject) {
this.subject = subject;
int flattenedLength = 0;
for (T[] a : subject) {
flattenedLength += a.length;
}
this.flattenedLength = flattenedLength;
}
@Override
public T get(int index) {
Point p = find(index);
return subject[p.x][p.y];
}
@Override
public T set(int index, T it) {
Point p = find(index);
T was = subject[p.x][p.y];
subject[p.x][p.y] = it;
return was;
}
public Point find(int index) {
int pos = 0;
// Walk the array to get the right row.
for(int row = 0; row < subject.length; row++) {
if(pos + subject[row].length <= index) {
// Skip this row.
pos += subject[row].length;
} else {
// Found it!!
return new Point(row,index-pos);
}
}
throw new IndexOutOfBoundsException("No item at position "+index);
}
@Override
public int size() {
return flattenedLength;
}
}
public void test() {
Integer[][] a = {
{1},
{2, 3, 4, 5},
{6, 7, 8, 9, 10}
};
List<Integer> flat = new Flattened<>(a);
System.out.println(flat);
}