/// <summary> /// Multiplies this matrix with another matrix and places the results into the result matrix. /// </summary> /// <param name="other">The matrix to multiply with.</param> /// <param name="result">The result of the multiplication.</param> protected override void DoMultiply(Matrix<float> other, Matrix<float> result) { var denseOther = other as DenseMatrix; var denseResult = result as DenseMatrix; if (denseOther != null && denseResult != null) { Control.LinearAlgebraProvider.MatrixMultiplyWithUpdate( Providers.LinearAlgebra.Transpose.DontTranspose, Providers.LinearAlgebra.Transpose.DontTranspose, 1.0f, _values, _rowCount, _columnCount, denseOther._values, denseOther._rowCount, denseOther._columnCount, 0.0f, denseResult._values); return; } var diagonalOther = other.Storage as DiagonalMatrixStorage<float>; if (diagonalOther != null) { var diagonal = diagonalOther.Data; var d = Math.Min(ColumnCount, other.ColumnCount); if (d < other.ColumnCount) { result.ClearSubMatrix(0, RowCount, ColumnCount, other.ColumnCount - ColumnCount); } int index = 0; for (int j = 0; j < d; j++) { for (int i = 0; i < RowCount; i++) { result.At(i, j, _values[index]*diagonal[j]); index++; } } return; } base.DoMultiply(other, result); }
/// <summary> /// Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. /// </summary> /// <param name="other">The matrix to multiply with.</param> /// <param name="result">The result of the multiplication.</param> protected override void DoTransposeThisAndMultiply(Matrix<Complex> other, Matrix<Complex> result) { var diagonalOther = other as DiagonalMatrix; var diagonalResult = result as DiagonalMatrix; if (diagonalOther != null && diagonalResult != null) { var thisDataCopy = new Complex[diagonalResult._data.Length]; var otherDataCopy = new Complex[diagonalResult._data.Length]; Array.Copy(_data, thisDataCopy, (diagonalResult._data.Length > _data.Length) ? _data.Length : diagonalResult._data.Length); Array.Copy(diagonalOther._data, otherDataCopy, (diagonalResult._data.Length > diagonalOther._data.Length) ? diagonalOther._data.Length : diagonalResult._data.Length); Control.LinearAlgebraProvider.PointWiseMultiplyArrays(thisDataCopy, otherDataCopy, diagonalResult._data); return; } var denseOther = other.Storage as DenseColumnMajorMatrixStorage<Complex>; if (denseOther != null) { var dense = denseOther.Data; var diagonal = _data; var d = Math.Min(denseOther.RowCount, ColumnCount); if (d < ColumnCount) { result.ClearSubMatrix(denseOther.RowCount, ColumnCount - denseOther.RowCount, 0, denseOther.ColumnCount); } int index = 0; for (int i = 0; i < denseOther.ColumnCount; i++) { for (int j = 0; j < d; j++) { result.At(j, i, dense[index]*diagonal[j]); index++; } index += (denseOther.RowCount - d); } return; } base.DoTransposeThisAndMultiply(other, result); }
/// <summary> /// Multiplies the transpose of this matrix with another matrix and places the results into the result matrix. /// </summary> /// <param name="other">The matrix to multiply with.</param> /// <param name="result">The result of the multiplication.</param> protected override void DoTransposeThisAndMultiply(Matrix<Complex32> other, Matrix<Complex32> result) { var diagonalOther = other as DiagonalMatrix; var diagonalResult = result as DiagonalMatrix; if (diagonalOther != null && diagonalResult != null) { var thisDataCopy = new Complex32[diagonalResult._data.Length]; var otherDataCopy = new Complex32[diagonalResult._data.Length]; Array.Copy(_data, 0, thisDataCopy, 0, (diagonalResult._data.Length > _data.Length) ? _data.Length : diagonalResult._data.Length); Array.Copy(diagonalOther._data, 0, otherDataCopy, 0, (diagonalResult._data.Length > diagonalOther._data.Length) ? diagonalOther._data.Length : diagonalResult._data.Length); Control.LinearAlgebraProvider.PointWiseMultiplyArrays(thisDataCopy, otherDataCopy, diagonalResult._data); return; } var denseOther = other.Storage as DenseColumnMajorMatrixStorage<Complex32>; if (denseOther != null) { var dense = denseOther.Data; var diagonal = _data; var d = Math.Min(denseOther.RowCount, ColumnCount); if (d < ColumnCount) { result.ClearSubMatrix(denseOther.RowCount, ColumnCount - denseOther.RowCount, 0, denseOther.ColumnCount); } int index = 0; for (int i = 0; i < denseOther.ColumnCount; i++) { for (int j = 0; j < d; j++) { result.At(j, i, dense[index]*diagonal[j]); index++; } index += (denseOther.RowCount - d); } return; } if (ColumnCount == RowCount) { other.Storage.MapIndexedTo(result.Storage, (i, j, x) => x*_data[i], Zeros.AllowSkip, ExistingData.Clear); } else { result.Clear(); other.Storage.MapSubMatrixIndexedTo(result.Storage, (i, j, x) => x*_data[i], 0, 0, other.RowCount, 0, 0, other.ColumnCount, Zeros.AllowSkip, ExistingData.AssumeZeros); } }