/** * Transposes, in-place, a matrix represent in row-major as a list of byte arrays. * * @param input The matrix to transpose */ public static List<StrictBitVector> transpose(List<StrictBitVector> input) { // Ensure the is correctly formed doSanityCheck(input); int minDim = Math.min(input.get(0).getSize(), input.size()); int maxDim = Math.max(input.get(0).getSize(), input.size()); // Check if the matrix is tall boolean tall = minDim == input.get(0).getSize(); int rows = tall ? minDim : maxDim; int columns = tall ? maxDim : minDim; byte[][] res = new byte[rows][columns / Byte.SIZE]; // Process all squares of minDim x minDim List<List<byte[]>> squares = IntStream.range(0, maxDim / minDim).parallel() .mapToObj(i -> extractSquare(input, minDim, tall, i)).map(m -> { transposeAllByteBlocks(m); return m; }).map(m -> { doEklundh(m); return m; }).collect(Collectors.toList()); IntStream.range(0, maxDim / minDim).parallel() .forEach(i -> insertSquare(res, squares.get(i), minDim, tall, i)); return IntStream.range(0, res.length).parallel().mapToObj(i -> res[i]).map(StrictBitVector::new) .collect(Collectors.toList()); }