public void Dtrmv(Boolean isUpperTriangular, Boolean transposeA, Boolean isUnitTriangular, DoubleMatrix2D A, DoubleMatrix1D x) { if (transposeA) { A = A.ViewDice(); isUpperTriangular = !isUpperTriangular; } Property.DEFAULT.CheckSquare(A); int size = A.Rows; if (size != x.Size) { throw new ArgumentException(A.ToStringShort() + ", " + x.ToStringShort()); } DoubleMatrix1D b = x.Like(); DoubleMatrix1D y = x.Like(); if (isUnitTriangular) { y.Assign(1); } else { for (int i = 0; i < size; i++) { y[i] = A[i, i]; } } for (int i = 0; i < size; i++) { double sum = 0; if (!isUpperTriangular) { for (int j = 0; j < i; j++) { sum += A[i, j] * x[j]; } sum += y[i] * x[i]; } else { sum += y[i] * x[i]; for (int j = i + 1; j < size; j++) { sum += A[i, j] * x[j]; } } b[i] = sum; } x.Assign(b); }
public void Dsymv(Boolean isUpperTriangular, double alpha, DoubleMatrix2D A, DoubleMatrix1D x, double beta, DoubleMatrix1D y) { if (isUpperTriangular) { A = A.ViewDice(); } Property.DEFAULT.CheckSquare(A); int size = A.Rows; if (size != x.Size || size != y.Size) { throw new ArgumentException(A.ToStringShort() + ", " + x.ToStringShort() + ", " + y.ToStringShort()); } DoubleMatrix1D tmp = x.Like(); for (int i = 0; i < size; i++) { double sum = 0; for (int j = 0; j <= i; j++) { sum += A[i, j] * x[j]; } for (int j = i + 1; j < size; j++) { sum += A[j, i] * x[j]; } tmp[i] = alpha * sum + beta * y[i]; } y.Assign(tmp); }