在java中,如何展平多维数组,将其传递给激活函数,并以最有效的方式从响应数组中检索原始层次结构?
例如,原始数据块的格式为
输入数据结构:
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]定义的激活函数可以在一次go中处理整个块,因此为了获得最大的效率,我想以某种方式将其展平。中间数据结构:
[.,.,.,.,.,.,. ... ]然后,我想“扁平化”响应,这样它就能反映原始的层次结构。
输出数据结构:
[[.,.,.,.,.,],
[.,.,.],
[.,.,.,.,.,.,.,.,.],
[.,.,.,.,.,.,.,.]]假设激活函数是按顺序处理的,因此顺序不会被打乱。在Java中,我可以实现相同的最快方法是什么?如果我使用数组,我不想维护展平和收缩的索引。
发布于 2018-05-23 23:23:57
这实现了一个带有get和set的List,还实现了一个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);
}https://stackoverflow.com/questions/50490093
复制相似问题