/// <summary> /// Subtracts another matrix from this matrix. /// </summary> /// <param name="other">The matrix to subtract.</param> /// <param name="result">The matrix to store the result of the subtraction.</param> /// <exception cref="ArgumentOutOfRangeException">If the two matrices don't have the same dimensions.</exception> protected override void DoSubtract(Matrix <double> other, Matrix <double> result) { // diagonal - diagonal = diagonal if (other is DiagonalMatrix diagOther && result is DiagonalMatrix diagResult) { LinearAlgebraControl.Provider.SubtractArrays(_data, diagOther._data, diagResult._data); return; } other.Negate(result); for (int i = 0; i < _data.Length; i++) { result.At(i, i, result.At(i, i) + _data[i]); } }
/// <summary> /// Subtracts another matrix from this matrix. /// </summary> /// <param name="other">The matrix to subtract.</param> /// <param name="result">The matrix to store the result of the subtraction.</param> /// <exception cref="ArgumentOutOfRangeException">If the two matrices don't have the same dimensions.</exception> protected override void DoSubtract(Matrix <double> other, Matrix <double> result) { // diagonal - diagonal = diagonal var diagOther = other as DiagonalMatrix; var diagResult = result as DiagonalMatrix; if (diagOther != null && diagResult != null) { Control.LinearAlgebraProvider.SubtractArrays(_data, diagOther._data, diagResult._data); return; } other.Negate(result); for (int i = 0; i < _data.Length; i++) { result.At(i, i, result.At(i, i) + _data[i]); } }
/// <summary> /// Subtracts another matrix from this matrix. /// </summary> /// <param name="other">The matrix to subtract.</param> /// <param name="result">The matrix to store the result of the subtraction.</param> /// <exception cref="ArgumentOutOfRangeException">If the two matrices don't have the same dimensions.</exception> protected override void DoSubtract(Matrix <double> other, Matrix <double> result) { // diagonal - diagonal = diagonal var diagOther = other as DiagonalMatrix; var diagResult = result as DiagonalMatrix; if (diagOther != null && diagResult != null) { Map2((x, y) => x - y, other, result, Zeros.AllowSkip); return; } other.Negate(result); for (int i = 0; i < _data.Length; i++) { result.At(i, i, result.At(i, i) + _data[i]); } }
/// <summary> /// Subtracts another matrix from this matrix. /// </summary> /// <param name="other">The matrix to subtract.</param> /// <param name="result">The matrix to store the result of the subtraction.</param> /// <exception cref="ArgumentOutOfRangeException">If the two matrices don't have the same dimensions.</exception> protected override void DoSubtract(Matrix<double> other, Matrix<double> result) { // diagonal - diagonal = diagonal var diagOther = other as DiagonalMatrix; var diagResult = result as DiagonalMatrix; if (diagOther != null && diagResult != null) { Control.LinearAlgebraProvider.SubtractArrays(_data, diagOther._data, diagResult._data); return; } other.Negate(result); for (int i = 0; i < _data.Length; i++) { result.At(i, i, result.At(i, i) + _data[i]); } }
/// <summary> /// Negate each element of this matrix and place the results into the result matrix. /// </summary> /// <param name="result">The result of the negation.</param> /// <exception cref="ArgumentNullException">If the result matrix is <see langword="null" />.</exception> /// <exception cref="ArgumentException">if the result matrix's dimensions are not the same as this matrix.</exception> public virtual void Negate(Matrix result) { if (result == null) { throw new ArgumentNullException("result"); } if (result.RowCount != RowCount || result.ColumnCount != ColumnCount) { throw new ArgumentException(Resources.ArgumentMatrixDimensions); } CopyTo(result); result.Negate(); }