使用 cblas_chpr 函数
Using the cblas_chpr function
当我尝试使用 cblas 库中的 cblas_chpr() 函数计算浮点复向量的相关矩阵时遇到问题。
从netLib.org下载Lapack v3.10.0 Library后,我编译并复制了libcblas.a,liblapack.a、liblapacke.a、librefblas.a和libtmglib.a 个文件到我的项目并确保库链接正确。
根据描述,cblas_chpr函数计算alpha * x * conjg(x') + A并将结果存入A。
函数定义为:
void cblas_chpr(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
const CBLAS_INDEX N, const float alpha, const void *X,
const CBLAS_INDEX incX, void *A);
其中参数为:
- layout - 这是一个 emun,两个可能的输入是 CblasRowMajor 和 CblasColMajor。
- Uplo - 这是一个枚举,两个可能的输入是 CblasUpper 和 CblasLower。
- N - 矩阵 A 的阶数和向量 x 中的元素数。
- alpha - 向量 X 乘以的比例因子。
- X - 矢量 X。
- incX - 在 X 内跨步。例如,如果 incX 为 7,则使用每第 7 个元素。
- A - 矩阵 A。被 return 上的结果覆盖。
我的函数体如下:
/* Number of elements */
int Ne = 10;
/* Set the parameters */
CBLAS_LAYOUT layout = CblasColMajor; /* Layout is column major */
CBLAS_UPLO Uplo = CblasUpper; /* Upper triangle of the matrix */
CBLAS_INDEX N = Ne; /* Number of elements in vector X */
float alpha = 1.0; /* No scaling, alpha = 1.0 */
/* The vector X */
float complex * X = malloc(Ne * sizeof(* X));
/* Set values of X - for illustration purpose only */
for(int i = 0; i < Ne; i++)
{
X[i] = CMPLXF(i, i + 1.0);
}
CBLAS_INDEX incX = 1; /* Use data from every element */
/* The correlation matrix is a Ne x Ne matrix */
float complex ** A = malloc(Ne * sizeof(*A));
for(int i = 0; i < Ne; i++)
{
A[i] = malloc(Ne * sizeof(*A[i]));
}
cblas_chpr(layout, Uplo, N, alpha, X, incX, A);
float complex print_val = A[0][0];
printf("%+.10f %+.10f", crealf(print_val), cimagf(print_val));
但是,程序崩溃并出现 “chpr_() at 0x55555555e70b”没有可用的源代码 错误。
我猜我的输入参数不正确。 CBLAS 是 Fortran BLAS 库的包装器。
有没有人以前遇到过这个错误并且知道如何解决?
回答我自己的问题,以防其他人 运行 遇到同样的问题。 A 应该是大小为 N * (N + 1) / 2 的一维数组。此外,数组 A 中每个元素的值必须初始化为零。否则,结果将是错误的。阅读 cblas_chpr() 函数的说明,了解为什么会出现这种情况。
/* Number of elements */
int Ne = 10;
/* Set the parameters */
CBLAS_LAYOUT layout = CblasColMajor; /* Layout is column major */
CBLAS_UPLO Uplo = CblasUpper; /* Upper triangle of the matrix */
CBLAS_INDEX N = Ne; /* Number of elements in vector X */
float alpha = 1.0; /* No scaling, alpha = 1.0 */
/* The vector X */
float complex * X = malloc(Ne * sizeof(* X));
/* Set values of X - for illustration purpose only */
for(int i = 0; i < Ne; i++)
{
X[i] = CMPLXF(i, i + 1.0);
}
CBLAS_INDEX incX = 1; /* Use data from every element */
/* Initialize the array that store correlation matrix */
int size_A = Ne * (Ne + 1) / 2;
float complex * A = malloc(size_A * sizeof(*A));
for(int i = 0; i < size_A; i++)
{
A[i] = 0.0;
}
cblas_chpr(layout, Uplo, N, alpha, X, incX, A);
/* Print the first value of the result */
float complex print_val = A[0][0];
printf("%+.10f %+.10f", crealf(print_val), cimagf(print_val));
free(X);
free(A);
当我尝试使用 cblas 库中的 cblas_chpr() 函数计算浮点复向量的相关矩阵时遇到问题。
从netLib.org下载Lapack v3.10.0 Library后,我编译并复制了libcblas.a,liblapack.a、liblapacke.a、librefblas.a和libtmglib.a 个文件到我的项目并确保库链接正确。
根据描述,cblas_chpr函数计算alpha * x * conjg(x') + A并将结果存入A。
函数定义为:
void cblas_chpr(CBLAS_LAYOUT layout, CBLAS_UPLO Uplo,
const CBLAS_INDEX N, const float alpha, const void *X,
const CBLAS_INDEX incX, void *A);
其中参数为:
- layout - 这是一个 emun,两个可能的输入是 CblasRowMajor 和 CblasColMajor。
- Uplo - 这是一个枚举,两个可能的输入是 CblasUpper 和 CblasLower。
- N - 矩阵 A 的阶数和向量 x 中的元素数。
- alpha - 向量 X 乘以的比例因子。
- X - 矢量 X。
- incX - 在 X 内跨步。例如,如果 incX 为 7,则使用每第 7 个元素。
- A - 矩阵 A。被 return 上的结果覆盖。
我的函数体如下:
/* Number of elements */
int Ne = 10;
/* Set the parameters */
CBLAS_LAYOUT layout = CblasColMajor; /* Layout is column major */
CBLAS_UPLO Uplo = CblasUpper; /* Upper triangle of the matrix */
CBLAS_INDEX N = Ne; /* Number of elements in vector X */
float alpha = 1.0; /* No scaling, alpha = 1.0 */
/* The vector X */
float complex * X = malloc(Ne * sizeof(* X));
/* Set values of X - for illustration purpose only */
for(int i = 0; i < Ne; i++)
{
X[i] = CMPLXF(i, i + 1.0);
}
CBLAS_INDEX incX = 1; /* Use data from every element */
/* The correlation matrix is a Ne x Ne matrix */
float complex ** A = malloc(Ne * sizeof(*A));
for(int i = 0; i < Ne; i++)
{
A[i] = malloc(Ne * sizeof(*A[i]));
}
cblas_chpr(layout, Uplo, N, alpha, X, incX, A);
float complex print_val = A[0][0];
printf("%+.10f %+.10f", crealf(print_val), cimagf(print_val));
但是,程序崩溃并出现 “chpr_() at 0x55555555e70b”没有可用的源代码 错误。
我猜我的输入参数不正确。 CBLAS 是 Fortran BLAS 库的包装器。
有没有人以前遇到过这个错误并且知道如何解决?
回答我自己的问题,以防其他人 运行 遇到同样的问题。 A 应该是大小为 N * (N + 1) / 2 的一维数组。此外,数组 A 中每个元素的值必须初始化为零。否则,结果将是错误的。阅读 cblas_chpr() 函数的说明,了解为什么会出现这种情况。
/* Number of elements */
int Ne = 10;
/* Set the parameters */
CBLAS_LAYOUT layout = CblasColMajor; /* Layout is column major */
CBLAS_UPLO Uplo = CblasUpper; /* Upper triangle of the matrix */
CBLAS_INDEX N = Ne; /* Number of elements in vector X */
float alpha = 1.0; /* No scaling, alpha = 1.0 */
/* The vector X */
float complex * X = malloc(Ne * sizeof(* X));
/* Set values of X - for illustration purpose only */
for(int i = 0; i < Ne; i++)
{
X[i] = CMPLXF(i, i + 1.0);
}
CBLAS_INDEX incX = 1; /* Use data from every element */
/* Initialize the array that store correlation matrix */
int size_A = Ne * (Ne + 1) / 2;
float complex * A = malloc(size_A * sizeof(*A));
for(int i = 0; i < size_A; i++)
{
A[i] = 0.0;
}
cblas_chpr(layout, Uplo, N, alpha, X, incX, A);
/* Print the first value of the result */
float complex print_val = A[0][0];
printf("%+.10f %+.10f", crealf(print_val), cimagf(print_val));
free(X);
free(A);