package org.signalml.util.matfiles.array.lazy; import java.io.DataOutputStream; import java.io.IOException; import org.signalml.util.matfiles.array.GenericArray; import org.signalml.util.matfiles.array.elements.DimensionsArray; import org.signalml.util.matfiles.types.ArrayClass; /** * This class is able to write a double array to a MAT-file * in a lazy mode - this means not the whole array at once, * but by asking the {@link ILazyDoubleArrayDataProvider} * for consecutive parts of the array. * * @author Piotr Szachewicz */ public class LazyExportDoubleArray extends GenericArray<Double> { /** * Provides the data from the double array in a lazy mode. */ private ILazyDoubleArrayDataProvider lazyDataProvider; public LazyExportDoubleArray(String arrayName, ILazyDoubleArrayDataProvider lazyDataProvider) { super(ArrayClass.MX_DOUBLE_CLASS, arrayName); this.lazyDataProvider = lazyDataProvider; dimensionsArray = new DimensionsArray(new int[] { lazyDataProvider.getNumberOfRows(), lazyDataProvider.getNumberOfColumns() }); } @Override protected int getNumberOfElements() { return lazyDataProvider.getNumberOfRows() * lazyDataProvider.getNumberOfColumns(); } @Override protected void writeData(DataOutputStream dataOutputStream) throws IOException { int samplesToGet = 1024; for (int x = 0; x < lazyDataProvider.getNumberOfColumns(); x += samplesToGet) { if (x + samplesToGet > lazyDataProvider.getNumberOfColumns()) { samplesToGet = lazyDataProvider.getNumberOfColumns() - x; } double[][] sampleChunk = lazyDataProvider.getDataChunk(x, samplesToGet); for (int j = 0; j < sampleChunk[0].length; j++) for (int i = 0; i < sampleChunk.length; i++) dataOutputStream.writeDouble(sampleChunk[i][j]); } } @Override protected void writeDataChunk(DataOutputStream dataOutputStream, int i, int j) throws IOException { //do nothing //this method is not used in this class } }