/// <summary> /// Multiplies this matrix with a vector and places the results into the result vector. /// </summary> /// <param name="rightSide">The vector to multiply with.</param> /// <param name="result">The result of the multiplication.</param> protected override void DoMultiply(Vector<Complex> rightSide, Vector<Complex> result) { var d = Math.Min(ColumnCount, RowCount); if (d < RowCount) { result.ClearSubVector(ColumnCount, RowCount - ColumnCount); } if (d == ColumnCount) { var denseOther = rightSide.Storage as DenseVectorStorage<Complex>; var denseResult = result.Storage as DenseVectorStorage<Complex>; if (denseOther != null && denseResult != null) { Control.LinearAlgebraProvider.PointWiseMultiplyArrays(_data, denseOther.Data, denseResult.Data); return; } } for (var i = 0; i < d; i++) { result.At(i, _data[i]*rightSide.At(i)); } }
/// <summary> /// Multiplies the conjugate transpose of this matrix with a vector and places the results into the result vector. /// </summary> /// <param name="rightSide">The vector to multiply with.</param> /// <param name="result">The result of the multiplication.</param> protected override void DoConjugateTransposeThisAndMultiply(Vector<Complex> rightSide, Vector<Complex> result) { var d = Math.Min(ColumnCount, RowCount); if (d < ColumnCount) { result.ClearSubVector(RowCount, ColumnCount - RowCount); } if (d == RowCount) { var denseOther = rightSide.Storage as DenseVectorStorage<Complex>; var denseResult = result.Storage as DenseVectorStorage<Complex>; if (denseOther != null && denseResult != null) { // TODO: merge/MulByConj Control.LinearAlgebraProvider.ConjugateArray(_data, denseResult.Data); Control.LinearAlgebraProvider.PointWiseMultiplyArrays(denseResult.Data, denseOther.Data, denseResult.Data); return; } } for (var i = 0; i < d; i++) { result.At(i, _data[i].Conjugate()*rightSide.At(i)); } }