Ejemplo n.º 1
0
			public IMapackMatrix Solve(IMapackMatrix rhs)
			{
				if (rhs.Rows != L.Rows)
				{
					throw new ArgumentException("Matrix dimensions do not match.");
				}
				if (!isSymmetric)
				{
					throw new InvalidOperationException("Matrix is not symmetric.");
				}
				if (!isPositiveDefinite)
				{
					throw new InvalidOperationException("Matrix is not positive definite.");
				}

				int dimension = L.Rows;
				int count = rhs.Columns;

				IMapackMatrix B = (IMapackMatrix)rhs.Clone();
				double[][] l = L.Array;

				// Solve L*Y = B;
				for (int k = 0; k < L.Rows; k++)
				{
					for (int i = k + 1; i < dimension; i++)
					{
						for (int j = 0; j < count; j++)
						{
							B[i, j] -= B[k, j] * l[i][k];
						}
					}

					for (int j = 0; j < count; j++)
					{
						B[k, j] /= l[k][k];
					}
				}

				// Solve L'*X = Y;
				for (int k = dimension - 1; k >= 0; k--)
				{
					for (int j = 0; j < count; j++)
					{
						B[k, j] /= l[k][k];
					}

					for (int i = 0; i < k; i++)
					{
						for (int j = 0; j < count; j++)
						{
							B[i, j] -= B[k, j] * l[k][i];
						}
					}
				}

				return B;
			}
Ejemplo n.º 2
0
			public IMapackMatrix Solve(IMapackMatrix rhs)
			{
				if (rhs.Rows != QR.Rows) throw new ArgumentException("Matrix row dimensions must agree.");
				if (!IsFullRank) throw new InvalidOperationException("Matrix is rank deficient.");

				// Copy right hand side
				int count = rhs.Columns;
				IMapackMatrix X = rhs.Clone();
				int m = QR.Rows;
				int n = QR.Columns;
				double[][] qr = QR.Array;

				// Compute Y = transpose(Q)*B
				for (int k = 0; k < n; k++)
				{
					for (int j = 0; j < count; j++)
					{
						double s = 0.0;
						for (int i = k; i < m; i++)
							s += qr[i][k] * X[i, j];
						s = -s / qr[k][k];
						for (int i = k; i < m; i++)
							X[i, j] += s * qr[i][k];
					}
				}

				// Solve R*X = Y;
				for (int k = n - 1; k >= 0; k--)
				{
					for (int j = 0; j < count; j++)
						X[k, j] /= Rdiag[k];

					for (int i = 0; i < k; i++)
						for (int j = 0; j < count; j++)
							X[i, j] -= X[k, j] * qr[i][k];
				}

				return X.Submatrix(0, n - 1, 0, count - 1);
			}