- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I would like to multiply
A = [ 1 2 6
2 3 1
6 1 4 ]
a symmetrix matrix with a dense matrix
B =[ 2 3
4 5
6 7 ];
and here is the code, but the results are wrong, what could be the problem?
int main()
{
double a[] = {1,2,6,3,1,4};
double b[] = {2,3,4,5,6,7};
double c[] = {0,0,0,0,0,0};
MKL_INT r = 3;
MKL_INT cc= 3;
MKL_INT k = 2;
double alpha = 1.0;
double beta = 0.0;
//
CBLAS_ORDER ord = CblasRowMajor;
CBLAS_SIDE side = CblasLeft;
CBLAS_UPLO uplo = CblasUpper;
cblas_dsymm( ord, side, uplo,
r, cc, alpha,
a, r, b, r,
beta, c, cc );
//
for(int z=0;z<6;z++)
std::cout << c
return 0;
}
Best regards,
Umut
Link Copied
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Umut,
could you have a check on the code bellow? The parameters do not look correct. The output for the following code is: 46 55 22 28 40 51
Thanks,
Chao
int main()
{
//double a[] = {1,2,6,3,1,4};
double a[] = {1,2,6,
2,3,1,
6,1,4};
double b[] = {2,3,4,5,6,7};
double c[] = {0,0,0,0,0,0};
MKL_INT r = 3;
//MKL_INT cc= 3;
MKL_INT cc= 2;
//MKL_INT k = 2;
double alpha = 1.0;
double beta = 0.0;
//
CBLAS_ORDER ord = CblasRowMajor;
CBLAS_SIDE side = CblasLeft;
CBLAS_UPLO uplo = CblasUpper;
/*cblas_dsymm( ord, side, uplo,
r, cc, alpha,
a, r, b, r,beta, c, cc );*/
cblas_dsymm( ord, side, uplo,
r, cc, alpha,
a, r, b, cc,beta, c, cc );
//
for(int z=0;z<6;z++)
std::cout << c
return 0;
}
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Thanks for the reply. The documentation is a bit confusing how the matrix is input was not clear to me. I mean understood to only input the upper triangular part of the A and then I was thinking it is ok, however it gets the whole matrix and internally does the operations I guess,
Thanks.
Umut
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
However, it is sufficient to fill in, i.e., define, only the upper triangle(s) of the input matrix(matrices) when you specify 'U' for uplo. To see this, replace
double a[] = {1,2,6,2,3,1,6,1,4};
by
double a[] = {1,2,6,0,3,1,0,0,4};
and you should see no change in the output. In fact, replacing the '0' values in this line by any other values should not affect the output, either.
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hello,
yes, it is right that the input A needs to rectangular arrays. but the low triangle in the matrix does not impact the computation.
thanks,
Chao
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
As meje and Chao mentioned, we need to allocate memory large enough to store a 3x3 matrix for symmetric A matrix. However, you only need to set lower or upper triangular elements of Adepending on the uplo symm parameter.
In your example code the input paramaters to cblas_dsymm are in error. For symm, m and n are number of rows and number of columns for C matrix respectively. Also, the leading dimensions for A and B matrices should be set considering that we are using the row-major ordering. Please find the code with the required modifications below. Comments describe the paramaters.
[cpp]#include#include using namespace std; int main() { /* 3x3 A matrix (symmetric) */ double a[] = {1,2,6,2,3,1,6,1,4}; /* 3x2 B Matrix */ double b[] = {2,3,4,5,6,7}; /* 3x2 C Matrix */ double c[] = {0,0,0,0,0,0}; /* Let's define the SYMM paramaters in terms * of row count and coloumn count of C */ MKL_INT rows_c = 3; MKL_INT cols_c= 2; double alpha = 1.0; double beta = 0.0; CBLAS_ORDER ord = CblasRowMajor; CBLAS_SIDE side = CblasLeft; CBLAS_UPLO uplo = CblasUpper; /* The leading dimension for A, B and C are set considering * row-major format. * * For this particular example: * lda = # of columns A (or rows since A is symmetric) * ldb = # of columns B * ldc = # of columns C */ cblas_dsymm( ord, side, uplo, rows_c, cols_c, alpha, a, rows_c, b, cols_c, beta, c, cols_c ); /* This should print 46 55 22 28 40 51 */ for(int z=0;z<6;z++) std::cout << c << std::endl; return 0; } [/cpp]
The output is:
46 55 22 28 40 51
Best wishes,
Efe
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page