Add transposeConjugate function for Complex and Double (conjugate values are not cached). Minor refactoring of MatrixContext and API reference changes

This commit is contained in:
Iaroslav Postovalov 2021-01-17 02:38:48 +07:00
parent 758508ba96
commit bd178d77ba
No known key found for this signature in database
GPG Key ID: 46E15E4A31B3BCD7
4 changed files with 46 additions and 16 deletions

View File

@ -1,6 +1,8 @@
package kscience.kmath.linear package kscience.kmath.linear
import kscience.kmath.operations.Complex
import kscience.kmath.operations.Ring import kscience.kmath.operations.Ring
import kscience.kmath.operations.conjugate
import kscience.kmath.structures.Matrix import kscience.kmath.structures.Matrix
import kscience.kmath.structures.Structure2D import kscience.kmath.structures.Structure2D
import kscience.kmath.structures.asBuffer import kscience.kmath.structures.asBuffer
@ -70,7 +72,7 @@ public fun <T : Any, R : Ring<T>> GenericMatrixContext<T, R, *>.one(rows: Int, c
/** /**
* A virtual matrix of zeroes * Returns virtual matrix of zeroes.
*/ */
public fun <T : Any, R : Ring<T>> GenericMatrixContext<T, R, *>.zero(rows: Int, columns: Int): FeaturedMatrix<T> = public fun <T : Any, R : Ring<T>> GenericMatrixContext<T, R, *>.zero(rows: Int, columns: Int): FeaturedMatrix<T> =
VirtualMatrix(rows, columns) { _, _ -> elementContext.zero } VirtualMatrix(rows, columns) { _, _ -> elementContext.zero }
@ -78,12 +80,27 @@ public fun <T : Any, R : Ring<T>> GenericMatrixContext<T, R, *>.zero(rows: Int,
public class TransposedFeature<T : Any>(public val original: Matrix<T>) : MatrixFeature public class TransposedFeature<T : Any>(public val original: Matrix<T>) : MatrixFeature
/** /**
* Create a virtual transposed matrix without copying anything. `A.transpose().transpose() === A` * Create a virtual transposed matrix without copying anything. `A.transpose().transpose() === A`.
*/ */
public fun <T : Any> Matrix<T>.transpose(): Matrix<T> { public fun <T : Any> Matrix<T>.transpose(): Matrix<T> = getFeature<TransposedFeature<T>>()?.original ?: VirtualMatrix(
return getFeature<TransposedFeature<T>>()?.original ?: VirtualMatrix( colNum,
colNum, rowNum,
rowNum, setOf(TransposedFeature(this)),
setOf(TransposedFeature(this)) ) { i, j -> get(j, i) }
) { i, j -> get(j, i) }
} /**
* Returns Hermitian conjugate of this matrix (i.e., just transposes it).
*
*
*/
public fun Matrix<Double>.transposeConjugate(): Matrix<Double> = transpose()
/**
* Returns Hermitian conjugate of this matrix (i.e., transposes it and replaces each element with its conjugate).
*
* @return the Hermitian conjugate of this matrix.
*/
public fun Matrix<Complex>.transposeConjugate(): Matrix<Complex> {
val t = transpose()
return VirtualMatrix(t.rowNum, t.colNum) { i, j -> t[i,j].conjugate }
}

View File

@ -10,7 +10,10 @@ import kscience.kmath.structures.Matrix
import kscience.kmath.structures.asSequence import kscience.kmath.structures.asSequence
/** /**
* Basic operations on matrices. Operates on [Matrix] * Basic operations on matrices. Operates on [Matrix].
*
* @param T the type of items in the matrices.
* @param M the type of operated matrices.
*/ */
public interface MatrixContext<T : Any, out M : Matrix<T>> : SpaceOperations<Matrix<T>> { public interface MatrixContext<T : Any, out M : Matrix<T>> : SpaceOperations<Matrix<T>> {
/** /**
@ -84,9 +87,16 @@ public interface MatrixContext<T : Any, out M : Matrix<T>> : SpaceOperations<Mat
} }
} }
/**
* Partial implementation of [MatrixContext] for matrices of [Ring].
*
* @param T the type of items in the matrices.
* @param R the type of ring of matrix elements.
* @param M the type of operated matrices.
*/
public interface GenericMatrixContext<T : Any, R : Ring<T>, out M : Matrix<T>> : MatrixContext<T, M> { public interface GenericMatrixContext<T : Any, R : Ring<T>, out M : Matrix<T>> : MatrixContext<T, M> {
/** /**
* The ring context for matrix elements * The ring over matrix elements.
*/ */
public val elementContext: R public val elementContext: R
@ -133,8 +143,6 @@ public interface GenericMatrixContext<T : Any, R : Ring<T>, out M : Matrix<T>> :
public override fun multiply(a: Matrix<T>, k: Number): M = public override fun multiply(a: Matrix<T>, k: Number): M =
produce(a.rowNum, a.colNum) { i, j -> elementContext { a[i, j] * k } } produce(a.rowNum, a.colNum) { i, j -> elementContext { a[i, j] * k } }
public operator fun Number.times(matrix: FeaturedMatrix<T>): M = multiply(matrix, this)
public override operator fun Matrix<T>.times(value: T): M = public override operator fun Matrix<T>.times(value: T): M =
produce(rowNum, colNum) { i, j -> elementContext { get(i, j) * value } } produce(rowNum, colNum) { i, j -> elementContext { get(i, j) * value } }
} }

View File

@ -2,17 +2,22 @@ package kscience.kmath.linear
import kscience.kmath.structures.Matrix import kscience.kmath.structures.Matrix
/**
* The matrix where each element is evaluated each time when is being accessed.
*
* @property generator the function that provides elements.
*/
public class VirtualMatrix<T : Any>( public class VirtualMatrix<T : Any>(
override val rowNum: Int, override val rowNum: Int,
override val colNum: Int, override val colNum: Int,
override val features: Set<MatrixFeature> = emptySet(), override val features: Set<MatrixFeature> = emptySet(),
public val generator: (i: Int, j: Int) -> T public val generator: (i: Int, j: Int) -> T,
) : FeaturedMatrix<T> { ) : FeaturedMatrix<T> {
public constructor( public constructor(
rowNum: Int, rowNum: Int,
colNum: Int, colNum: Int,
vararg features: MatrixFeature, vararg features: MatrixFeature,
generator: (i: Int, j: Int) -> T generator: (i: Int, j: Int) -> T,
) : this( ) : this(
rowNum, rowNum,
colNum, colNum,

View File

@ -72,6 +72,6 @@ else
/** /**
* Alias for [Structure2D] with more familiar name. * Alias for [Structure2D] with more familiar name.
* *
* @param T the type of items. * @param T the type of items in the matrix.
*/ */
public typealias Matrix<T> = Structure2D<T> public typealias Matrix<T> = Structure2D<T>