/// <summary>Performs a symmetric rank-k update, i.e. C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C. /// </summary> /// <param name="level3">The BLAS level 3 implementation.</param> /// <param name="n">The order of matrix C.</param> /// <param name="k">The number of columns of matrix A if to calculate C:= \alpha*A*A^t + \beta *C; otherwise the number of rows of matrix A.</param> /// <param name="alpha">The scalar \alpha.</param> /// <param name="a">The matrix A supplied column-by-column of dimension (s, ka), where s must be at least max(1,<paramref name="n"/>) and ka is <paramref name="k"/> if to calculate C:= \alpha*A*A^t + \beta *C; s at least max(1,<paramref name="k"/>) and ka <paramref name="n"/> otherwise.</param> /// <param name="beta">The scalar \beta.</param> /// <param name="c">The symmetric matrix C supplied column-by-column of dimension (<paramref name="n"/>, <paramref name="n"/>).</param> /// <param name="triangularMatrixType">A value whether matrix C is in its upper or lower triangular representation.</param> /// <param name="operation">A value indicating whether to calculate C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C.</param> public static void zsyrk(this ILevel3BLAS level3, int n, int k, Complex alpha, Complex[] a, Complex beta, Complex[] c, BLAS.TriangularMatrixType triangularMatrixType = BLAS.TriangularMatrixType.UpperTriangularMatrix, BLAS.XsyrkOperation operation = BLAS.XsyrkOperation.ATimesATranspose) { level3.zsyrk(n, k, alpha, a, beta, c, operation == BLAS.XsyrkOperation.ATimesATranspose ? n : k, n, triangularMatrixType, operation); }
/// <summary>Performs a symmetric rank-k update, i.e. C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C. /// </summary> /// <param name="n">The order of matrix C.</param> /// <param name="k">The number of columns of matrix A if to calculate C:= \alpha*A*A^t + \beta *C; otherwise the number of rows of matrix A.</param> /// <param name="alpha">The scalar \alpha.</param> /// <param name="a">The matrix A supplied column-by-column of dimension (<paramref name="lda" />, ka), where ka is <paramref name="k" /> if to calculate C:= \alpha*A*A^t + \beta *C; otherwise <paramref name="n" />.</param> /// <param name="beta">The scalar \beta.</param> /// <param name="c">The symmetric matrix C supplied column-by-column of dimension (<paramref name="ldc" />, <paramref name="n" />).</param> /// <param name="lda">The leading dimension of <paramref name="a" />, must be at least max(1,<paramref name="n" />) if to calculate C:= \alpha*A*A^t + \beta *C; max(1,<paramref name="k" />) otherwise.</param> /// <param name="ldc">The leading dimension of <paramref name="c" />, must be at least max(1,<paramref name="n" />).</param> /// <param name="triangularMatrixType">A value whether matrix C is in its upper or lower triangular representation.</param> /// <param name="operation">A value indicating whether to calculate C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C.</param> public void zsyrk(int n, int k, Complex alpha, Complex[] a, Complex beta, Complex[] c, int lda, int ldc, BLAS.TriangularMatrixType triangularMatrixType = BLAS.TriangularMatrixType.UpperTriangularMatrix, BLAS.XsyrkOperation operation = BLAS.XsyrkOperation.ATimesATranspose) { if (operation == BLAS.XsyrkOperation.ATimesATranspose) { if (triangularMatrixType == BLAS.TriangularMatrixType.UpperTriangularMatrix) { for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) { c[i + j * ldc] *= beta; } for (int ell = 0; ell < k; ell++) { Complex temp = alpha * a[j + ell * lda]; for (int i = 0; i <= j; i++) { c[i + j * ldc] += temp * a[i + ell * lda]; } } } } else { for (int j = 0; j < n; j++) { for (int i = j; i < n; i++) { c[i + j * ldc] *= beta; } for (int ell = 0; ell < k; ell++) { Complex temp = alpha * a[j + ell * lda]; for (int i = j; i < n; i++) { c[i + j * ldc] += temp * a[i + ell * lda]; } } } } } else // C:= \alpha * A' * A + \beta * C { if (triangularMatrixType == BLAS.TriangularMatrixType.UpperTriangularMatrix) { for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) { Complex temp = 0.0; for (int ell = 0; ell < k; ell++) { temp += a[ell + i * lda] * a[ell + j * lda]; } c[i + j * ldc] = alpha * temp + beta * c[i + j * ldc]; } } } else { for (int j = 0; j < n; j++) { for (int i = j; i < n; i++) { Complex temp = 0.0; for (int ell = 0; ell < k; ell++) { temp += a[ell + i * lda] * a[ell + j * lda]; } c[i + j * ldc] = alpha * temp + beta * c[i + j * ldc]; } } } } }
/// <summary>Performs a symmetric rank-k update, i.e. C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C. /// </summary> /// <param name="n">The order of matrix C.</param> /// <param name="k">The number of columns of matrix A if to calculate C:= \alpha*A*A^t + \beta *C; otherwise the number of rows of matrix A.</param> /// <param name="alpha">The scalar \alpha.</param> /// <param name="a">The matrix A supplied column-by-column of dimension (<paramref name="lda"/>, ka), where ka is <paramref name="k"/> if to calculate C:= \alpha*A*A^t + \beta *C; otherwise <paramref name="n"/>.</param> /// <param name="beta">The scalar \beta.</param> /// <param name="c">The symmetric matrix C supplied column-by-column of dimension (<paramref name="ldc"/>, <paramref name="n"/>).</param> /// <param name="lda">The leading dimension of <paramref name="a"/>, must be at least max(1,<paramref name="n"/>) if to calculate C:= \alpha*A*A^t + \beta *C; max(1,<paramref name="k"/>) otherwise.</param> /// <param name="ldc">The leading dimension of <paramref name="c"/>, must be at least max(1,<paramref name="n"/>).</param> /// <param name="triangularMatrixType">A value whether matrix C is in its upper or lower triangular representation.</param> /// <param name="operation">A value indicating whether to calculate C:= \alpha*A*A^t + \beta *C or C:= \alpha*A^t*A + \beta*C.</param> public void dsyrk(int n, int k, double alpha, double[] a, double beta, double[] c, int lda, int ldc, BLAS.TriangularMatrixType triangularMatrixType = BLAS.TriangularMatrixType.UpperTriangularMatrix, BLAS.XsyrkOperation operation = BLAS.XsyrkOperation.ATimesATranspose) { if (n == 0 || ((alpha == 0.0 || k == 0) && (beta == 1.0))) { return; // nothing to do } if (operation == BLAS.XsyrkOperation.ATimesATranspose) // C = \alpha *A*A' + \beta * C { if (triangularMatrixType == BLAS.TriangularMatrixType.UpperTriangularMatrix) { for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) { c[i + j * ldc] = beta * c[i + j * ldc]; } for (int ell = 0; ell < k; ell++) { double temp = alpha * a[j + ell * lda]; for (int i = 0; i <= j; i++) { c[i + j * ldc] += temp * a[i + ell * lda]; } } } } else { for (int j = 0; j < n; j++) { for (int i = j; i < n; i++) { c[i + j * ldc] = beta * c[i + j * ldc]; } for (int ell = 0; ell < k; ell++) { double temp = alpha * a[j + ell * lda]; for (int i = j; i < n; i++) { c[i + j * ldc] += temp * a[i + ell * lda]; } } } } } else // C = \alpha *A'*A + \beta *C { if (triangularMatrixType == BLAS.TriangularMatrixType.UpperTriangularMatrix) { for (int j = 0; j < n; j++) { for (int i = 0; i <= j; i++) { double temp = 0.0; for (int ell = 0; ell < k; ell++) { temp += a[ell + i * lda] * a[ell + j * lda]; } c[i + j * ldc] = alpha * temp + beta * c[i + j * ldc]; } } } else { for (int j = 0; j < n; j++) { for (int i = j; i < n; i++) { double temp = 0.0; for (int ell = 0; ell < k; ell++) { temp += a[ell + i * lda] * a[ell + j * lda]; } c[i + j * ldc] = alpha * temp + beta * c[i + j * ldc]; } } } } }