private static Dataset ifft1d(final Dataset a, final int n, final int axis) { Dataset result = null; Dataset dest = null; int[] shape; PositionIterator pi; int[] pos; boolean[] hit; switch (a.getDtype()) { case Dataset.FLOAT32: case Dataset.COMPLEX64: FloatFFT_1D ffft = new FloatFFT_1D(n); float[] fdata = null; shape = a.getShape(); shape[axis] = n; result = new ComplexFloatDataset(shape); dest = new ComplexFloatDataset(new int[] {n}); fdata = (float[]) dest.getBuffer(); pi = a.getPositionIterator(axis); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(fdata, 0.f); a.copyItemsFromAxes(pos, hit, dest); ffft.complexInverse(fdata, true); result.setItemsOnAxes(pos, hit, fdata); } break; case Dataset.FLOAT64: case Dataset.COMPLEX128: DoubleFFT_1D dfft = new DoubleFFT_1D(n); double[] ddata = null; shape = a.getShape(); shape[axis] = n; result = new ComplexDoubleDataset(shape); dest = new ComplexDoubleDataset(new int[] {n}); ddata = (double[]) dest.getBuffer(); pi = a.getPositionIterator(axis); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(ddata, 0.); a.copyItemsFromAxes(pos, hit, dest); dfft.complexInverse(ddata, true); result.setItemsOnAxes(pos, hit, ddata); } break; default: logger.warn("Non-float dataset not yet supported"); break; } return result; }
private static Dataset fft3d(final Dataset a, final int[] s, final int[] axes) { Dataset result = null; Dataset dest = null; PositionIterator pi; int[] pos; boolean[] hit; switch (a.getDtype()) { case Dataset.FLOAT32: case Dataset.COMPLEX64: FloatFFT_3D ffft = new FloatFFT_3D(s[0], s[1], s[2]); float[] fdata = null; result = new ComplexFloatDataset(newShape(a.getShapeRef(), s, axes)); dest = new ComplexFloatDataset(s); fdata = (float[]) dest.getBuffer(); pi = a.getPositionIterator(axes); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(fdata, 0.f); a.copyItemsFromAxes(pos, hit, dest); ffft.complexForward(fdata); result.setItemsOnAxes(pos, hit, fdata); } break; case Dataset.FLOAT64: case Dataset.COMPLEX128: DoubleFFT_3D dfft = new DoubleFFT_3D(s[0], s[1], s[2]); double[] ddata = null; result = new ComplexDoubleDataset(newShape(a.getShapeRef(), s, axes)); dest = new ComplexDoubleDataset(s); ddata = (double[]) dest.getBuffer(); pi = a.getPositionIterator(axes); pos = pi.getPos(); hit = pi.getOmit(); while (pi.hasNext()) { Arrays.fill(ddata, 0.); a.copyItemsFromAxes(pos, hit, dest); dfft.complexForward(ddata); result.setItemsOnAxes(pos, hit, ddata); } break; default: logger.warn("Non-float dataset not yet supported"); break; } return result; }
@Override public StringDatasetBase sort(Integer axis) { if (axis == null) { Arrays.sort(data); } else { axis = checkAxis(axis); StringDatasetBase ads = new StringDatasetBase(shape[axis]); PositionIterator pi = getPositionIterator(axis); int[] pos = pi.getPos(); boolean[] hit = pi.getOmit(); while (pi.hasNext()) { copyItemsFromAxes(pos, hit, ads); Arrays.sort(ads.data); setItemsOnAxes(pos, hit, ads.data); } } setDirty(); return this; // throw new UnsupportedOperationException("Cannot sort dataset"); // BOOLEAN_USE }