///<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; } } }