Hi list,

I'm trying to learn inline by translating snippets of c++ code from 
the book "Numerical Recipes".

in page 44-45, there is a c++ code to perform Gauss-Jordan elimination of a 
matrix (see below). I understand that they have a large template of additional 
operator/function/class (it is online: www.nr.com/codefile.php?nr3 ) which 
means the codes in the book have to be slightly 'translated' (correct me if i'm 
wrong) unto proper inline inputs. I think i have a problem with translating the 
matrix functions. I have searched the devel archives, but have only found codes 
to assign full row/column (not individual matrix entries). 

Anyhow, my use of 'a[j][k]' in line 44 (and similar threats later) seem to be 
an issue: none of the examples in Rcpp seems to use it. My question is how do 
you translate this construct (i.e. a[j][k]) so that inline can 'eat' it ?


library(Rcpp)
library(inline)


fun3<-'
        NumericMatrix a(x) ;
        NumericMatrix b = clone<NumericMatrix>(a);
        int i,icol,irow,j,k,l,ll,n=a.nrow(),m=a.ncol();
        std::vector<int> indxc(n); 
        std::vector<int> indxr(n);
        std::vector<int> ipiv(n);
        double big,dum,piinv;
        for(j=0;j<n;j++) ipiv[j]=0;
        for(i=0;i<n;i++ ){
                big=0.0;
                for(j=0;j<n;j++){
                        if(ipiv[j] != 1)
                                for(k=0;k<n;k++){
                                        if(ipiv[k] == 0) {
                                                if(abs(a[j][k]) >= big) {
                                                        big = abs(a[j][k]);
                                                        irow = j;
                                                        icol = k;
                                                }
                                        }
                                }
                        ++(ipiv[icol]);
                        if(irow != icol){
                                for (l=0;l<n;l++){
                                        dum = a[irow][l];
                                        a[irow][l] = a[icol][l];
                                        a[icol][l] = dum;
                                }
                                for (l=0; l<m ; l++){
                                        dum = b[irow][l];
                                        b[irow][l] = b[icol][l];
                                        b[icol][l] = dum;
                                }
                        }
                        idxr[i] = irow;
                        idxc[i] = icol;
                        if(a[icol][icol]==0.0) throw ("gaussj: Singular 
Matrix");
                        pivinv=1.0/a[icol][icol];
                        a[icol][icol]=1.0;
                        for(l=0;l<n;l++) a[icol][l] *= pivinv;
                        for(l=0;l<m;l++) b[icol][l] *= pivinv;
                        for(ll=0;ll<n,ll++)
                                if(ll != icol) {
                                        dum = a[ll][icol];
                                        a[ll][icol] = 0.0;
                                        for(l=0;l<n;l++) a[ll][l] -= 
a[icol][l]*dum;
                                        for(l=0;l<m;l++) b[ll][l] -= 
b[icol][l]*dum;
                                }
                }
                for(l=n-1;l>=0;l--){
                        if(indxr[l] != indxc[l])
                                for(k=0;k<n;k++)
                                        dum = a[k][indxr[l]];
                                        a[k][indxr[l]] = a[k][indxc[l]];
                                        a[k][indxc[l]] = dum;
                }
}
'
f.Rcpp<-cxxfunction(signature(x="matrix"),fun3,plugin="Rcpp",verbose=T) 

_______________________________________________
Rcpp-devel mailing list
Rcpp-devel@lists.r-forge.r-project.org
https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/rcpp-devel

Reply via email to