Example #1
0
        /// <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);
        }