lapack error (example)

Globe Trotter itsme_410 at yahoo.com
Tue Sep 27 20:34:54 UTC 2005


anyone else get this error?

many thanks!

--- Globe Trotter <itsme_410 at yahoo.com> wrote:

> Here is an example: please try it and see what you get.
> 
> Included are files svdd-demo.c and array.h and test.dat
> 
> To compile, use
> 
> % gcc svdd-demo.c -ansi -Wall -pedantic -lm -llapack
> 
> % a.out
> 
> 
> reading in matrix A from test.dat:
>     2.117079     2.992091 
>     2.106365     1.970807 
>     2.131384     3.130390 
>     2.344235     2.667219 
>     1.838804     3.243629 
> 
> 
>  ** On entry to DGESDD parameter number 12 had an illegal value
> STOP 0
> 
> If you change m to <=4 it works fine. So there is an error for m
> "substantially
> larger" than n (=2 here). Works fine on SuSE and RHEL3/4.
> 
> Thanks!
> 
> __________________________________________________
> Do You Yahoo!?
> Tired of spam?  Yahoo! Mail has the best spam protection around 
> http://mail.yahoo.com > #include <stdio.h> 
> #include <stdlib.h> 
> #include "array.h"
> 
> #define MIN(i,j) ((i)<(j) ? (i) : (j))
> #define MAX(i,j) ((i)>(j) ? (i) : (j))
> 
> void dgesdd_(	char *jobz,
> 		int *m,
> 		int *n,
> 		double *a,
> 		int *lda,
> 		double *s,
> 		double *u,
> 		int *ldu,
> 		double *vt,
> 		int *ldvt,
> 		double *work,
> 		int *lwork,
> 		int *iwork,
> 		int *info);
> 
> int svdd(double **a, int m, int n, double *d, double **u, double **v)
> {
> 	double *A, *U, *VT;
> 	int lwork = 3*MIN(m,n)*MIN(m,n)
> 		+ MAX(MAX(m,n),4*MIN(m,n)*MIN(m,n)+4*MIN(m,n));
> 	int liwork = 8*MIN(m,n);
> 	char jobz = 'A';
> 	double *work;
> 	int *iwork;
> 	int i, j, k, info;
> 
> 	MAKE_VECTOR(A, m*n);
> 	for (j=0, k=0; j<n; j++)
> 		for (i=0; i<m; i++)
> 			A[k++] = a[i][j];
> 
> 	MAKE_VECTOR(U, m*m);
> 	MAKE_VECTOR(VT, n*n);
> 	MAKE_VECTOR(work, lwork);
> 	MAKE_VECTOR(iwork, liwork);
> 
> 	dgesdd_(&jobz, &m, &n, A, &m, d, U, &m, VT, &n,
> 			work, &lwork, iwork, &info);
> 
> 	for (j=0, k=0; j<m; j++)
> 		for (i=0; i<m; i++)
> 			u[i][j] = U[k++];
> 
> 	/* VT, as calculated by dgesdd_(), is the transpose of the right
> 	 * multiplier.  Here we undo the transpose so that the matrix
> 	 * v[][] returned by this function is not transposed anymore.
> 	 */
> 	for (j=0, k=0; j<n; j++)
> 		for (i=0; i<n; i++)
> 			v[j][i] = VT[k++];
> 
> 	FREE_VECTOR(A);
> 	FREE_VECTOR(U);
> 	FREE_VECTOR(VT);
> 	FREE_VECTOR(work);
> 	FREE_VECTOR(iwork);
> 
> 	return info;
> }
> 
> int main(void)
> {
> 	FILE *fp;
> 	double **a, **u, **v, *d;
> 	int m=5, n=2;
> 	int ld = MIN(m,n);
> 	int i, j;
> 	int result;
> 
> 	fp = fopen("test.dat", "r");
> 	if (fp == NULL) {
> 		fprintf(stderr, "Error opening file test.dat\n");
> 		return EXIT_FAILURE;
> 	}
> 
> 	MAKE_MATRIX(a, m, n);
> 	MAKE_MATRIX(u, m, m);
> 	MAKE_MATRIX(v, n, n);
> 	MAKE_VECTOR(d, ld);
> 
> 	puts("reading in matrix A from test.dat:");
> 	for(i=0; i<m; i++) {
> 		for(j=0; j<n; j++) {
> 			fscanf(fp, "%lf", &a[i][j]);
> 			printf("%12.6f ", a[i][j]);
> 		}
> 		putchar('\n');
> 	}
> 	putchar('\n');
> 	putchar('\n');
> 	fclose(fp);
> 
> 	result = svdd(a, m, n, d, u, v);
> 
> 	printf("svdd returned %d\n", result);
> 
> 	if (result!=0) {
> 		fprintf(stderr, "exiting!\n");
> 		return EXIT_FAILURE;
> 	}
> 
> 	putchar('\n');
> 
> 	printf("singular values are:\n");
> 	for (i=0; i<ld; i++)
> 		printf("%12.6f ", d[i]);
> 	putchar('\n');
> 	putchar('\n');
> 
> 	puts("The left multiplier matrix, u, is:");
> 	for(i=0; i<m; i++) {
> 		for(j=0; j<m; j++)
> 			printf("%12.6f ", u[i][j]);
> 		putchar('\n');
> 	}
> 	putchar('\n');
> 
> 	puts("The right multiplier matrix, v, is:");
> 	for(i=0; i<n; i++) {
> 		for(j=0; j<n; j++)
> 			printf("%12.6f ", v[i][j]);
> 		putchar('\n');
> 	}
> 	putchar('\n');
> 
> 	FREE_MATRIX(a);
> 	FREE_MATRIX(u);
> 	FREE_MATRIX(v);
> 	FREE_VECTOR(d);
> 
> 	return EXIT_SUCCESS;
> }
> > /* array.h
> 
>    o This file defines the following macros:
> 
>      MAKE_1ARRAY(a,n)       make a 1D array of length "n"
>      MAKE_2ARRAY(a,m,n)     make a 2D array of dimensions "m x n"
>      MAKE_3ARRAY(a,l,m,n)   make a 3D array of dimensions "l x m x n"
>      MAKE_4ARRAY(a,k,l,m,n) make a 4D array of dimensions "k x l x m x n"
> 
>      FREE_1ARRAY(a)         free memory allocated by MAKE_1ARRAY()
>      FREE_2ARRAY(a)         free memory allocated by MAKE_2ARRAY()
>      FREE_3ARRAY(a)         free memory allocated by MAKE_3ARRAY()
>      FREE_4ARRAY(a)         free memory allocated by MAKE_4ARRAY()
> 
>    o Additionally, it defines the following convenience macros as synonyms:
> 
>      MAKE_VECTOR(a,n)       same as MAKE_1ARRAY(a,n)
>      FREE_VECTOR(a)         same as FREE_1ARRAY(a)
>      MAKE_MATRIX(a,m,n)     same as MAKE_2ARRAY(a,m,n)
>      FREE_MATRIX(a)         same as FREE_2ARRAY(a)
> 
>    o Additionally, it declares and uses the identifiers:
> 
>      ARRAY_H2RESERVED
>      ARRAY_H3RESERVED
>      ARRAY_H4RESERVED
> 
>      within local blocks within the macros.  THESE IDENTIFIERS
>      ARE RESERVED.  The user should not use identifiers with this
>      names within the scope of these macros.
> 
>    o vector/matrix/array elements can be of _any_ type.
> 
>    o If malloc() fails during the execution of any of the MAKE_* macros:
>          . An "out of memory" message is printed to stderr.
>          . The macro's first argument is set to NULL.
> 
>    o After a call to any of the FREE_*() macros, the macro's argument
>      is set to NULL.
> 
>    o The FREE_*() macros can be applied to previously FREE_*()-ed
>      arrays with no ill effect.
> 
>    o Note that macro arguments are evaluated more than once.
> 
>    o Customization
> 
>       When malloc() returns NULL, MAKE_1ARRAY prints a message on stderr
>       and the program continues.  The user can alter this behavior by
>       redefining the MAKE_1ARRAY macro.  For instance, to call exit()
>       whenever malloc() fails, the user can do:
> 
>       #undef MAKE_1ARRAY
>       #define MAKE_1ARRAY(a,n) do {                                         
> \
>           (a) = malloc((n) * sizeof *(a));                                  
> \
>           if ((a)==NULL) {                                                  
> \
>               fprintf(stderr, "*** in file %s, function %s(), line %d: "    
> \
>                       "out of memory!\n",  __FILE__, __func__, __LINE__);   
> \
>               exit(EXIT_FAILURE);                                           
> \
>           }                                                                 
> \
>       } while (0)
> 
>       Since only MAKE_1ARRAY calls malloc() explicitly, this change affects
>       the behavior of not only MAKE_1ARRAY but all other MAKE_* macros as
> well.
> 
> 
> ---- SAMPLE USAGE -------------
> #include "array.h"
> int main(void)
> {
>     float ***a;            // can use any other type instead of "float"
>     size_t p=3, q=4, r=5;  // will make a 3x4x5 3-D array of float
> 
>     MAKE_3ARRAY(a, p, q, r);
>     if (a==NULL)
>         return EXIT_FAILURE;
> 
>     a[2][0][1] = 3.14;
>     printf("%g \n", a[2][0][1]);
>     FREE_3ARRAY(a);
>     return EXIT_SUCCESS;
> }
> ---- END OF SAMPLE USAGE -------
> 
> 
>    Author: Rouben Rostamian, <rostamian at umbc.edu>
>    June 2000
>    Revised Jul 2000
>    Revised Sep 2002
>    Revised Jun 2003 - macros don't call exit anymore
>                       changed macro names to all-caps
>    Revised Aug 2003 - changed reserved names to all caps
>    Revised Dec 2003 - changed array index types to size_t (were int)
>                     - added an "out of memory" message, printed to stderr
>                     - most FREE* macros now come before MAKE* macros,
> 		      for possible improved efficiency in preprocessing
> */
> 
> 
> #ifndef H_ARRAY_
> #define H_ARRAY_
> 
> #include <stdio.h>
> #include <stdlib.h>
> 
> /* ---------- 1D arrays ---------------------- */
> 
> #define MAKE_1ARRAY(a,n) do {                                               
> \
>     (a) = malloc((n) * sizeof *(a));                                        
> \
>     if ((a)==NULL)                                                          
> \
>         fprintf(stderr, "*** in file %s, function %s(), line %d: "          
> \
>                 "out of memory!\n",  __FILE__, __func__, __LINE__);         
> \
> } while (0)                                                                  
> 
> #define FREE_1ARRAY(a)  do {                                                
> \
>     free(a);                                                                
> \
>     a = NULL;                                                               
> \
> } while (0)
> 
> /* ---------- 2D arrays ---------------------- */
> 
> #define FREE_2ARRAY(a) do {                                                 
> \
>     size_t ARRAY_H2RESERVED;                                                
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     for (ARRAY_H2RESERVED=0; (a)[ARRAY_H2RESERVED]!=NULL;
> ARRAY_H2RESERVED++)\
>         FREE_1ARRAY((a)[ARRAY_H2RESERVED]);                                 
> \
>     FREE_1ARRAY(a);                                                         
> \
> } while (0)
> 
> /* note: parenthesize first arg because it may be given as `*a' */
> #define MAKE_2ARRAY(a,m,n) do {                                             
> \
>     size_t ARRAY_H2RESERVED;                                                
> \
>     MAKE_1ARRAY(a,(m)+1);                                                   
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     (a)[m] = NULL;                                                          
> \
>     for (ARRAY_H2RESERVED=0; ARRAY_H2RESERVED<(m); ARRAY_H2RESERVED++) {    
> \
>         MAKE_1ARRAY((a)[ARRAY_H2RESERVED],(n));                             
> \
>         if ((a)[ARRAY_H2RESERVED]==NULL) {                                  
> \
>             FREE_2ARRAY(a);                                                 
> \
>             break;                                                          
> \
>         }                                                                   
> \
>     }                                                                       
> \
> } while (0)
> 
> /* ---------- 3D arrays ---------------------- */
> 
> #define FREE_3ARRAY(a) do {                                                 
> \
>     size_t ARRAY_H3RESERVED;                                                
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     for (ARRAY_H3RESERVED=0; (a)[ARRAY_H3RESERVED]!=NULL;
> ARRAY_H3RESERVED++)\
>         FREE_2ARRAY((a)[ARRAY_H3RESERVED]);                                 
> \
>     FREE_1ARRAY(a);                                                         
> \
> } while (0)
> 
> #define MAKE_3ARRAY(a,p,q,r) do {                                           
> \
>     size_t ARRAY_H3RESERVED;                                                
> \
>     MAKE_1ARRAY(a,(p)+1);                                                   
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     (a)[p] = NULL;                                                          
> \
>     for (ARRAY_H3RESERVED=0; ARRAY_H3RESERVED<(p); ARRAY_H3RESERVED++) {    
> \
>         MAKE_2ARRAY((a)[ARRAY_H3RESERVED],(q),(r));                         
> \
>         if ((a)[ARRAY_H3RESERVED]==NULL) {                                  
> \
>             FREE_3ARRAY(a);                                                 
> \
>             break;                                                          
> \
>         }                                                                   
> \
>     }                                                                       
> \
> } while (0)
> 
> /* ---------- 3D arrays ---------------------- */
> 
> #define FREE_4ARRAY(a) do {                                                 
> \
>     size_t ARRAY_H4RESERVED;                                                
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     for (ARRAY_H4RESERVED=0; (a)[ARRAY_H4RESERVED]!=NULL;
> ARRAY_H4RESERVED++)\
>         FREE_3ARRAY((a)[ARRAY_H4RESERVED]);                                 
> \
>     FREE_1ARRAY(a);                                                         
> \
> } while (0)
> 
> #define MAKE_4ARRAY(a,p,q,r,s) do {                                         
> \
>     size_t ARRAY_H4RESERVED;                                                
> \
>     MAKE_1ARRAY(a,(p)+1);                                                   
> \
>     if (a==NULL)                                                            
> \
>         break;                                                              
> \
>     (a)[p] = NULL;                                                          
> \
>     for (ARRAY_H4RESERVED=0; ARRAY_H4RESERVED<(p); ARRAY_H4RESERVED++) {    
> \
>         MAKE_3ARRAY((a)[ARRAY_H4RESERVED],(q),(r),(s));                     
> \
>         if ((a)[ARRAY_H4RESERVED]==NULL) {                                  
> \
>             FREE_4ARRAY(a);                                                 
> \
>             break;                                                          
> \
>         }                                                                   
> \
>     }                                                                       
> \
> } while (0)
> 
> /* ---------- synonyms ---------------------- */
> 
> #define MAKE_VECTOR(a,n)    MAKE_1ARRAY(a,n)
> #define MAKE_MATRIX(a,m,n)  MAKE_2ARRAY(a,m,n)
> 
> #define FREE_VECTOR(a)      FREE_1ARRAY(a)
> #define FREE_MATRIX(a)      FREE_2ARRAY(a)
> 
> #endif /* H_ARRAY_ */
> > -- 
> fedora-list mailing list
> fedora-list at redhat.com
> To unsubscribe: https://www.redhat.com/mailman/listinfo/fedora-list



		
__________________________________ 
Yahoo! Mail - PC Magazine Editors' Choice 2005 
http://mail.yahoo.com




More information about the fedora-list mailing list