- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I have the following function and I'm trying to compute C = A*A' using zsyrk from blas, but when I print the C matrix the results are wrong. What am I missing?
double* zsyrk(int N, double *A) {
int i,j;
int K;
K = N;
const int * alpha;
int a = 1;
alpha = &a;
int lda = N;
int ldc = N;
const int * beta;
int b = 0;
beta = &b;
double *C;
C = (double *)calloc( N*N, sizeof(double));
for (i = 0; i < N; i++){
for(j = 0; j < N; j++){
printf("%lf ", A[i*N + j]);
}
printf("\n");
}
cblas_zsyrk(CblasRowMajor, CblasUpper, CblasTrans, N, K, alpha, A, lda, beta, C, ldc);
for (i = 0; i < N; i++){
for(j = 0; j < N; j++){
printf("%lf ", C[i*N + j]);
}
printf("\n");
}
return C;
}
The restults are:
Matrix A:
-662.059957 -942.824833
545.621059 -270.699577
Matrix C:
-0.000000 0.000000
0.000000 -0.000000
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Andrews,
are the array A complex number or double array?
How about try cblas_dsyrk to replace the cblas_zsyrk
Best regards,
Ying
BLAS routine names have the following structure:
<character> <name> <mod> ( )
The <character> field indicates the data type:
| s | real, single precision |
| c | complex, single precision |
| d | real, double precision |
| z | complex, double precision |
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hej,
First of all please read the documentation more careful next time.
Instead of int declare both constants, alpha and beta, as double
e.g.
const double * alpha; |
09 |
double a = 1; |
10 |
alpha = &a; |
Also, in order to calculate C as C = A*A' (+yada yada) , you have to use CblasNoTrans instead of CblasTrans (check the documentation).
Now everything will work just as intended.
Regards,
Petru
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hej,
First of all, please read the documentation[0] more carefully next time.
In order to calculate correctly you have to:
1. change the alpha and beta constants from int to double.
e.g.
1 |
const double * alpha; |
2 |
double a = 1; |
3 |
alpha = &a; |
4 |
5 |
const double * beta; |
6 |
double b = 0; |
7 |
|
2. change CblasTrans to CblasNoTrans (check the documentation[0])
[0]:https://software.intel.com/en-us/mkl-developer-reference-c-cblas-syrk
Regards,
Petru
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page