/// <summary> /// Initializes a new instance of the <see cref="UserGramSchmidt"/> class. This object creates an unitary matrix /// using the modified Gram-Schmidt method. /// </summary> /// <param name="matrix">The matrix to factor.</param> /// <exception cref="ArgumentNullException">If <paramref name="matrix"/> is <c>null</c>.</exception> /// <exception cref="ArgumentException">If <paramref name="matrix"/> row count is less then column count</exception> /// <exception cref="ArgumentException">If <paramref name="matrix"/> is rank deficient</exception> public UserGramSchmidt(Matrix <Complex32> matrix) { if (matrix == null) { throw new ArgumentNullException("matrix"); } if (matrix.RowCount < matrix.ColumnCount) { throw new ArgumentException(Resources.ArgumentMatrixDimensions); } MatrixQ = matrix.Clone(); MatrixR = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < MatrixQ.ColumnCount; k++) { var norm = MatrixQ.Column(k).Norm(2).Real; if (norm == 0.0f) { throw new ArgumentException(Resources.ArgumentMatrixNotRankDeficient); } MatrixR.At(k, k, norm); for (var i = 0; i < MatrixQ.RowCount; i++) { MatrixQ.At(i, k, MatrixQ.At(i, k) / norm); } for (var j = k + 1; j < MatrixQ.ColumnCount; j++) { var dot = Complex32.Zero; for (int i = 0; i < MatrixQ.RowCount; i++) { dot += MatrixQ.Column(k)[i].Conjugate() * MatrixQ.Column(j)[i]; } MatrixR.At(k, j, dot); for (var i = 0; i < MatrixQ.RowCount; i++) { var value = MatrixQ.At(i, j) - (MatrixQ.At(i, k) * dot); MatrixQ.At(i, j, value); } } } }
/// <summary> /// Initializes a new instance of the <see cref="UserGramSchmidt"/> class. This object creates an orthogonal matrix /// using the modified Gram-Schmidt method. /// </summary> /// <param name="matrix">The matrix to factor.</param> /// <exception cref="ArgumentNullException">If <paramref name="matrix"/> is <c>null</c>.</exception> /// <exception cref="ArgumentException">If <paramref name="matrix"/> row count is less then column count</exception> /// <exception cref="ArgumentException">If <paramref name="matrix"/> is rank deficient</exception> public UserGramSchmidt(Matrix <float> matrix) { if (matrix == null) { throw new ArgumentNullException("matrix"); } if (matrix.RowCount < matrix.ColumnCount) { throw new ArgumentException(Resources.ArgumentMatrixDimensions); } MatrixQ = matrix.Clone(); MatrixR = matrix.CreateMatrix(matrix.ColumnCount, matrix.ColumnCount); for (var k = 0; k < MatrixQ.ColumnCount; k++) { var norm = MatrixQ.Column(k).Norm(2); if (norm == 0.0) { throw new ArgumentException(Resources.ArgumentMatrixNotRankDeficient); } MatrixR.At(k, k, norm); for (var i = 0; i < MatrixQ.RowCount; i++) { MatrixQ.At(i, k, MatrixQ.At(i, k) / norm); } for (var j = k + 1; j < MatrixQ.ColumnCount; j++) { var dot = MatrixQ.Column(k).DotProduct(MatrixQ.Column(j)); MatrixR.At(k, j, dot); for (var i = 0; i < MatrixQ.RowCount; i++) { var value = MatrixQ.At(i, j) - (MatrixQ.At(i, k) * dot); MatrixQ.At(i, j, value); } } } }