/// <summary> /// Gets the sparse data array. /// </summary> /// <param name="matrix">The matrix to get the data from.</param> /// <param name="name">The name of the matrix.</param> /// <returns>The matrix data as an array.</returns> private static byte[] GetSparseDataArray(SparseMatrix matrix, string name) { byte[] data; using (var dataMemoryStream = new MemoryStream()) using (var dataWriter = new BinaryWriter(dataMemoryStream)) { var nzmax = matrix.NonZerosCount; WriteMatrixTagAndName(dataWriter, ArrayClass.Sparse, false, name, matrix.RowCount, matrix.ColumnCount, nzmax); // write ir dataWriter.Write((int)DataType.Int32); dataWriter.Write(nzmax * 4); foreach (var column in matrix.ColumnEnumerator()) { foreach (var row in column.Item2.GetIndexedEnumerator()) { dataWriter.Write(row.Item1); } } // add pad if needed if (nzmax % 2 == 1) { dataWriter.Write(0); } // write jc dataWriter.Write((int)DataType.Int32); dataWriter.Write((matrix.ColumnCount + 1) * 4); dataWriter.Write(0); var count = 0; foreach (var column in matrix.ColumnEnumerator()) { count += ((SparseVectorStorage <double>)column.Item2.Storage).ValueCount; dataWriter.Write(count); } // add pad if needed if (matrix.ColumnCount % 2 == 0) { dataWriter.Write(0); } // write data dataWriter.Write((int)DataType.Double); dataWriter.Write(nzmax * 8); foreach (var column in matrix.ColumnEnumerator()) { foreach (var row in column.Item2.GetIndexedEnumerator()) { dataWriter.Write(row.Item2); } } data = dataMemoryStream.ToArray(); } return(data); }