示例#1
0
        ///<inheritdoc/>
        public override void Write(
            Utf8JsonWriter writer,
            MatrixImplementor <Complex> value,
            JsonSerializerOptions options)
        {
            writer.WriteStartObject();

            if (value is DenseComplexMatrixImplementor denseComplexMatrixImplementor)
            {
                writer.WriteNumber("StorageScheme", (int)StorageScheme.Dense);
                writer.WriteNumber("NumberOfRows", denseComplexMatrixImplementor.NumberOfRows);
                writer.WriteNumber("NumberOfColumns", denseComplexMatrixImplementor.NumberOfColumns);

                writer.WriteStartArray("Storage");
                for (int i = 0; i < denseComplexMatrixImplementor.storage.Length; i++)
                {
                    JsonSerializer.Serialize <Complex>(
                        writer,
                        denseComplexMatrixImplementor.storage[i],
                        options);
                }
                writer.WriteEndArray();
            }
            else if (value is SparseCsr3ComplexMatrixImplementor sparseComplexMatrixImplementor)
            {
                writer.WriteNumber("StorageScheme", (int)StorageScheme.CompressedRow);
                writer.WriteNumber("NumberOfRows", sparseComplexMatrixImplementor.NumberOfRows);
                writer.WriteNumber("NumberOfColumns", sparseComplexMatrixImplementor.NumberOfColumns);

                writer.WriteNumber("Capacity", (int)sparseComplexMatrixImplementor.capacity);

                writer.WriteStartArray("Values");
                for (int i = 0; i < sparseComplexMatrixImplementor.values.Length; i++)
                {
                    JsonSerializer.Serialize <Complex>(
                        writer,
                        sparseComplexMatrixImplementor.values[i],
                        options);
                }
                writer.WriteEndArray();

                writer.WriteStartArray("Columns");
                for (int i = 0; i < sparseComplexMatrixImplementor.columns.Length; i++)
                {
                    writer.WriteNumberValue(sparseComplexMatrixImplementor.columns[i]);
                }
                writer.WriteEndArray();

                writer.WriteStartArray("RowIndex");
                for (int i = 0; i < sparseComplexMatrixImplementor.rowIndex.Length; i++)
                {
                    writer.WriteNumberValue(sparseComplexMatrixImplementor.rowIndex[i]);
                }
                writer.WriteEndArray();
            }

            writer.WriteEndObject();
        }
        internal sealed override MatrixImplementor <double> this[string rowIndexes, string columnIndexes]
        {
            get
            {
                int thisNumberOfRows = this.numberOfRows;

                int      rowsLength    = thisNumberOfRows;
                int      columnsLength = this.numberOfColumns;
                var      subMatrix     = new DenseDoubleMatrixImplementor(rowsLength, columnsLength);
                double[] subStorage    = subMatrix.storage;

                double[] thisStorage = this.storage;

                int offset, index = 0;

                for (int j = 0; j < columnsLength; j++)
                {
                    offset = thisNumberOfRows * j;
                    for (int i = 0; i < rowsLength; i++, index++)
                    {
                        subStorage[index] = thisStorage[i + offset];
                    }
                }

                return(subMatrix);
            }
            set
            {
                // Test for mismatched matrix dimensions
                ImplementationServices.ThrowOnMismatchedMatrixDimensions(this.numberOfRows, this.numberOfColumns, value);

                // if the source is this, nothing has to be done
                if (object.ReferenceEquals(this, value))
                {
                    return;
                }

                MatrixImplementor <double> sourceImplementor = value;

                int offset;

                int thisNumberOfRows = this.numberOfRows;
                int rowsLength       = thisNumberOfRows;
                int columnsLength    = this.numberOfColumns;

                switch (sourceImplementor.StorageScheme)
                {
                case StorageScheme.CompressedRow:
                {
                    var source       = (SparseCsr3DoubleMatrixImplementor)sourceImplementor;
                    var sourceValues = source.values;

                    for (int j = 0; j < columnsLength; j++)
                    {
                        offset = thisNumberOfRows * j;
                        for (int i = 0; i < rowsLength; i++)
                        {
                            if (source.TryGetPosition(i, j, out int index))
                            {
                                this.storage[i + offset] = sourceValues[index];
                            }
                        }
                    }
                }
                break;

                case StorageScheme.Dense:
                {
                    var      source        = (DenseDoubleMatrixImplementor)sourceImplementor;
                    double[] sourceStorage = source.storage;
                    int      index         = 0;
                    for (int j = 0; j < columnsLength; j++)
                    {
                        offset = thisNumberOfRows * j;
                        for (int i = 0; i < rowsLength; i++, index++)
                        {
                            this.storage[i + offset] = sourceStorage[index];
                        }
                    }
                }
                break;
                }
            }
        }