private static void copySubArray(AbstractArray a1, AbstractArray a2, int[] subscripts, int axis) {

    if (axis < subscripts.length) {
      final int limit = Math.min(a1.getDimension(axis), a2.getDimension(axis));
      for (int i = 0; i < limit; i++) {
        subscripts[axis] = i;
        copySubArray(a1, a2, subscripts, axis + 1);
      }
    } else {
      int i1 = a1.getRowMajorIndex(subscripts);
      int i2 = a2.getRowMajorIndex(subscripts);
      a2.aset(i2, a1.AREF(i1));
    }
  }