//¤³¤Î¥Ú¡¼¥¸¤¬É½¼¨¤µ¤ì¤ëÊý¤Ï¡¢URL¤«¤é¡Öaction=SOURCE&¡×¤òºï½ü¤·¤Æ¤ß¤Æ¤¯¤À¤µ¤¤ [[£ÒÈ÷˺Ͽ - µ­»ö°ìÍ÷]] !!!R¡ÊR¸À¸ì¡Ë¤Ç¥í¡¼¥É¤Ç¤­¤ë¥é¥¤¥Ö¥é¥ê¡Ê.so¥Õ¥¡¥¤¥ë¡Ë¤Î¥³¥ó¥Ñ¥¤¥ë¤Î¤ªºîË¡¡©¡ÊLinux¡Ë *Åê¹Æ¼Ô¡§ ¤ß¤å *¥«¥Æ¥´¥ê¡§ ¤Ê¤· *Í¥ÀèÅÙ¡§ ÉáÄÌ *¾õÂÖ¡§ ´°Î» *Æü»þ¡§ 2009ǯ06·î03Æü 08»þ57ʬ46Éà //{{bugstate}} !!ÆâÍÆ *R_HOME¤Ë¤¢¤ëMakefile¤ò¥¤¥ó¥¯¥ë¡¼¥É¤·¤Æ¡¢Make¤¹¤ë¤È¡¢ÊØÍø !Makefile¿÷·Á R_SHARE_DIR = ${R_HOME}/share/ R_INCLUDE_DIR = ${R_HOME}/include #include $(R_HOME)/etc${R_ARCH}/Makeconf include ${R_HOME}/etc${R_ARCH}/Makeconf TARGET = kawase007.so COBJS = kawase007_main.o kawase007.o Rconnection.o #HEADER = #BASIS = *.h $(TARGET): $(COBJS) g++ -std=gnu99 $(SHLIB_LDFLAGS) $(LDFLAGS) -o $@ $(COBJS) $(ALL_LIBS) -llapack -lg2c -lm # $(SHLIB_LINK) -o $@ $(COBJS) $(ALL_LIBS) -llapack -lg2c -lm # Ä̾ï¤Ê¤é¾åµ­¥³¥á¥ó¥È¥¢¥¦¥È¤·¤Æ¤¤¤ë¹Ô¤Ç¡¢¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤ë¤Ï¤º # $(SHLIB_LINK)¤Ç»ØÄꤵ¤ì¤Æ¤¤¤ë¥ê¥ó¥«¡¼¡Êgcc¡Ë¤ò»È¤¦¤È¥¨¥é¡¼¤¬½Ð¤ë¾ì¹ç¤Ï¡¢Êѹ¹¤·¤Æ¤ß¤ë¤È¤è¤¤ # c++¤Ê¤É¤¬¡¢º®¤¶¤Ã¤Æ¤¤¤ë¾ì¹ç¤Ê¤É¡© # ¾åµ­¤Ç¤Ïg++¤ËÊѹ¹¤·¤Æ¤¤¤ë clean : rm -f *.o !blas¤È¤«¡¢lapack´ØÏ¢¤Î¥é¥¤¥Ö¥é¥ê¤òºîÀ®¤·¤¿¤¤¾ì¹ç blaslapack.so : blaslapack.o $(SHLIB_LINK) -o $@ blaslapack.o $(ALL_LIBS) -llapack -lg2c -lm !atlas¤È¤«¤À¤È blaslapack.so : blaslapack.o $(SHLIB_LINK) -o $@ blaslapack.o $(ALL_LIBS) -L/usr/local/atlas/lib -llapack -lptcblas -lptf77blas -latlas *${R_HOME}/etc${R_ARCH}/Makeconf¤ò¡¢¤â¤Ã¤È¾Ü¤·¤¯¤ß¤ë¤È¡¢¤³¤ó¤Ê¤³¤È¤ò¤ï¤¶¤ï¤¶¡¢½ñ¤¯É¬Íפâ¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¤¬¡¥ !!2009/10/24Äɲà !Gentoo¤Ç¤ÎÎã­¡ *test01.c #include #include "R_ext/BLAS.h" void test01(double a[]){ a[0] = a[0] * 2; return; } void test02(int *n, double *a, double x[], double y[]){ int incx = 1; int incy = 1; daxpy_(n, a, x, &incx, y, &incy); } *Makefile R_SHARE_DIR = ${R_HOME}/share/ R_INCLUDE_DIR = ${R_HOME}/include #include $(R_HOME)/etc${R_ARCH}/Makeconf include ${R_HOME}/etc${R_ARCH}/Makeconf %.so : %.o $(SHLIB_LINK) -o $@ $< $(ALL_LIBS) clean : rm -f *.o *make $ make test01.so gcc -std=gnu99 -I/usr/local/lib/R/include -I/usr/local/include -fpic -g -O2 -c test01.c -o test01.o gcc -std=gnu99 -shared -L/usr/local/lib -o test01.so test01.o -L/usr/local/lib/R/lib -lR *R > .C("test01", 3) [[1]] [1] 6 > .C("test01", a=c(3,9)) $a [1] 6 9 > .C("test02", n=as.integer(3), a=0.1, x=c(3,6,9), y=c(0,0,0)) $a [1] 6 9 > .C("test02", n=as.integer(3), a=0.1, x=c(3,6,9), y=c(0,0,0)) $n [1] 3 $a [1] 0.1 $x [1] 3 6 9 $y [1] 0.3 0.6 0.9 !Gentoo¤Ç¤ÎÎã­¢ *test02.c #include #include "R_ext/BLAS.h" void test01(double a[]){ a[0] = a[0] * 2; return; } void test02(int *n, double *a, double x[], double y[]){ int incx = 1; int incy = 1; daxpy_(n, a, x, &incx, y, &incy); } void test03(int *n, double a[], int *info){ char *UPLO = "U"; int lda = *n; dpotrf_(UPLO, n, a, &lda, info); } void test04(int *n, double a[], int *info){ char *JOBZ = "N"; char *UPLO = "U"; int lda = *n; double w[*n]; int lwork = 3*(*n)-1; double work[lwork]; dsyev_(JOBZ, UPLO, n, a, &lda, w, work, &lwork, info); } *¼Â¹Ô·ë²Ì > .C("test04", n=as.integer(dim(A)[1]), a=A, w=double(dim(A)[1]), info=integer(1)) $n [1] 5 $a [,1] [,2] [,3] [,4] [,5] [1,] 0.914646112 0.11281429 -0.122770717 0.07373369 -0.0662105 [2,] -0.088367911 0.89860486 -0.135535733 0.39746774 0.6268844 [3,] 0.084026524 -0.03413390 0.874546126 -0.19257233 0.3982850 [4,] -0.012745596 0.21714071 0.008365559 0.94047705 0.1168292 [5,] 0.009942577 -0.09413683 -0.059808934 -0.03333698 1.1367381 $w [1] 0.6459856 0.8160620 0.9824064 1.0956348 1.2249235 $info [1] 0 > eigen(A) $values [1] 1.2249235 1.0956348 0.9824064 0.8160620 0.6459856 $vectors [,1] [,2] [,3] [,4] [,5] [1,] 0.22305982 0.5677500 0.6318367 -0.45577070 0.1447748 [2,] -0.48195385 -0.3237559 0.2476938 -0.04993972 0.7739874 [3,] -0.03343607 0.3956827 0.2586180 0.87261401 0.1182319 [4,] -0.43461646 -0.3182952 0.5976240 0.03090832 -0.5930320 [5,] 0.72660537 -0.5612178 0.3396947 0.16543443 0.1196585 *¤Ê¤¼¡¢¥ê¥ó¥¯»þ¤Ëblas¤È¤«lapack¤È¤«¥ê¥ó¥¯¤·¤Æ¤Ê¤¤¤Î¤Ë¡¢»È¤¨¤ë¤Î¤«¤È»×¤Ã¤¿¤é¡¦¡¦¡¦ # ldd /usr/local/lib/R/lib/libR.so linux-gate.so.1 => (0xffffe000) libblas.so.0 => /usr/lib/libblas.so.0 (0xb7c03000) liblapack.so.0 => /usr/lib/liblapack.so.0 (0xb7780000) libatlas.so.0 => /usr/lib/libatlas.so.0 (0xb73f0000) libgfortran.so.1 => /usr/lib/gcc/i486-pc-linux-gnu/4.1.2/libgfortran.so.1 (0xb7375000) libm.so.6 => /lib/libm.so.6 (0xb734e000) libreadline.so.5 => /lib/libreadline.so.5 (0xb731b000) libdl.so.2 => /lib/libdl.so.2 (0xb7317000) libc.so.6 => /lib/libc.so.6 (0xb71e7000) /lib/ld-linux.so.2 (0xb7f47000) libgcc_s.so.1 => /usr/lib/gcc/i486-pc-linux-gnu/4.3.2/libgcc_s.so.1 (0xb71d9000) libcblas.so.0 => /usr/lib/libcblas.so.0 (0xb71b9000) libncurses.so.5 => /lib/libncurses.so.5 (0xb7173000) # nm /usr/local/lib/R/lib/libR.so | grep daxpy U daxpy_ # nm /usr/lib/liblapack.a | grep dpotrf ATL_dpotrf.o: 00000000 T ATL_dpotrf U ATL_dpotrfL U ATL_dpotrfU ATL_dpotrfL.o: 00000000 T ATL_dpotrfL ATL_dpotrfU.o: 00000000 T ATL_dpotrfU U ATL_dpotrf ATL_f77wrap_dpotrf.o: U ATL_dpotrf 00000000 T atl_f77wrap_dpotrf_ U ATL_dpotrf clapack_dpotrf.o: U ATL_dpotrf 00000000 T clapack_dpotrf U dpotrf_ dpotrf.o: U atl_f77wrap_dpotrf_ 00000000 T dpotrf_ U dpotrf_ U dpotrf_ U dpotrf_ *¤È¤¤¤¦¤³¤È¤Ï¡¢º£¸Æ¤Ð¤ì¤Æ¤¤¤ë´Ø¿ô¤Ï¡¢atlas¤Ç¤Ê¤¤¤Ã¤Æ¤³¤È¤«¡¥ !!!Gentoo¤Ç¤ÎÎã­£ *test03.c #include #include "Rdefines.h" #include "R_ext/BLAS.h" #include "R_ext/Lapack.h" ¡¦¡¦¡¦ void test04(int *n, double a[], double w[], int *info){ char *JOBZ = "N"; char *UPLO = "U"; int lda = *n; //double w[*n]; int lwork = 3*(*n)-1; double work[lwork]; dsyev_(JOBZ, UPLO, n, a, &lda, w, work, &lwork, info); } SEXP test05(SEXP Rn, SEXP Ra, SEXP Rw, SEXP Rinfo){ char *JOBZ = "N"; char *UPLO = "U"; int n = INTEGER(Rn)[0]; int lda = n; int lwork = 3*(n)-1; double work[lwork]; dsyev_(JOBZ, UPLO, &n, REAL(Ra), &lda, REAL(Rw), work, &lwork, INTEGER(Rinfo)); return Rw; } *·ë²Ì > dyn.load("test03.so") > .C("test04", n=as.integer(dim(A)[1]), a=A, w=double(dim(A)[1]), info=integer(1)) $n [1] 5 $a [,1] [,2] [,3] [,4] [,5] [1,] 0.914646112 0.11281429 -0.122770717 0.07373369 -0.0662105 [2,] -0.088367911 0.89860486 -0.135535733 0.39746774 0.6268844 [3,] 0.084026524 -0.03413390 0.874546126 -0.19257233 0.3982850 [4,] -0.012745596 0.21714071 0.008365559 0.94047705 0.1168292 [5,] 0.009942577 -0.09413683 -0.059808934 -0.03333698 1.1367381 $w [1] 0.6459856 0.8160620 0.9824064 1.0956348 1.2249235 $info [1] 0 > .Call("test05", n=as.integer(dim(A)[1]), a=A, w=double(dim(A)[1]), info=integer(1)) [1] 0.6459856 0.8160620 0.9824064 1.0956348 1.2249235 > eigen(A) $values [1] 1.0956954+0.1880367i 1.0956954-0.1880367i 0.9341475+0.1143243i [4] 0.9341475-0.1143243i 0.7053265+0.0000000i $vectors [,1] [,2] [,3] [1,] -0.5096168+0.1154550i -0.5096168-0.1154550i 0.79037907+0.00000000i [2,] -0.1020337-0.4360399i -0.1020337+0.4360399i 0.03818506+0.11768606i [3,] 0.5414950+0.0000000i 0.5414950+0.0000000i -0.06175406-0.58207539i [4,] -0.2286156-0.3090191i -0.2286156+0.3090191i 0.07552457-0.01562969i [5,] 0.2889004+0.0445094i 0.2889004-0.0445094i 0.03088052-0.10230174i [,4] [,5] [1,] 0.79037907+0.00000000i 0.36196003+0i [2,] 0.03818506-0.11768606i -0.59582930+0i [3,] -0.06175406+0.58207539i 0.43142099+0i [4,] 0.07552457+0.01562969i 0.57154733+0i [5,] 0.03088052+0.10230174i -0.03437971+0i *¤Ê¤ó¤«¤á¤Á¤ã¤¯¤Á¤ã¤¢¤ä¤·¤¤¤ó¤Ç¤¹¤¬¡© **¤¢¤¢¡¢¤·¤Þ¤Ã¤¿¡¥¤³¤Ã¤Á¤Î¡Ö.Call¡×¤Î¸Æ¤ÓÊý¤À¤È¡¢A¼«ÂΤòÊѹ¹¤·¤Æ¤·¤Þ¤¦¤ó¤À¤Ã¤¿¡¥¤¢¤Ö¤Ê¤¤¤¢¤Ö¤Ê¤¤¡¥ !!!Gentoo¤Ç¤ÎÎã­¤ #include #include "Rdefines.h" #include "R_ext/BLAS.h" #include "R_ext/Lapack.h" ¡¦¡¦¡¦ SEXP test06(SEXP Ra){ char *JOBZ = "N"; char *UPLO = "U"; int n = INTEGER(GET_DIM(Ra))[0]; int lda = n; int lwork = 3*(n)-1; double work[lwork]; SEXP Rw; int info; PROTECT(Rw = allocVector(REALSXP, n)); dsyev_(JOBZ, UPLO, &n, REAL(Ra), &lda, REAL(Rw), work, &lwork, &info); UNPROTECT(1); return Rw; } *¼Â¹Ô·ë²Ì > dyn.load("test04.so") > A <- cov(matrix(rnorm(500),100,5)) > .C("test04", n=as.integer(dim(A)[1]), a=A, w=double(dim(A)[1]), info=integer(1)) $n [1] 5 $a [,1] [,2] [,3] [,4] [,5] [1,] 0.834463115 0.15527427 -0.48993713 0.03185757 0.04401092 [2,] -0.008567303 0.90121558 -0.17016539 0.01605062 0.43986948 [3,] 0.136655892 0.09518474 0.97289541 0.22299300 0.22452943 [4,] -0.062643576 0.06514187 0.11326410 0.96736289 -0.18335848 [5,] 0.012954799 0.12947744 0.06609119 0.11099574 1.05222868 $w [1] 0.6190685 0.7479007 0.9502250 1.1082119 1.3027596 $info [1] 0 > .Call("test06", a=A) [1] 0.6190685 0.7479007 0.9502250 1.1082119 1.3027596 !!¥³¥á¥ó¥È //{{comment}}