- 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