如何修改我的R代码以加快计算速度

如何修改我的R代码以加快计算速度,r,R,这是我的R代码。你能给我一些建议,这样可以加快计算速度:) 首先,函数myfun()生成一个复数 其次,我使用myfun()计算矩阵M的元素 myfun以下是一些加速函数的建议。我使用三个“技巧”: 将尽可能多的函数矢量化 使用外部功能,而不是双循环 将隐藏的gemcrossprod用于最终矩阵产品 myfun在h的定义中,是否应该是*x+(a+b)/2-a)没有句点?是的,没有句点@ekstroemI感谢你的帮助:)这些“技巧”很有用@埃克斯特罗姆 myfun<-function(a,b

这是我的R代码。你能给我一些建议,这样可以加快计算速度:)

首先,函数
myfun()
生成一个复数

其次,我使用
myfun()
计算矩阵M的元素


myfun以下是一些加速函数的建议。我使用三个“技巧”:

  • 将尽可能多的函数矢量化
  • 使用
    外部
    功能,而不是双循环
  • 将隐藏的gem
    crossprod
    用于最终矩阵产品


    myfun在
    h
    的定义中,是否应该是
    *x+(a+b)/2-a)
    没有句点?是的,没有句点@ekstroemI感谢你的帮助:)这些“技巧”很有用@埃克斯特罗姆
    myfun<-function(a,b,nq,ul,uk)
     {
       m<-seq(1,(nq/2)+1,length=(nq/2)+1);
       k<-m;
    
       D<-matrix(NA,nrow = length(k),ncol = length(k)); 
    
      for(i in 1:length(k)) # row
        for(j in 1:length(m)) # column
        {
          D[i,j]<-(2/nq)*cos(((j-1)*(i-1)*pi)/(nq*0.5))
        }
    
        D[,1]<-D[,1]*0.5;
        D[,ncol(D)]<-D[,ncol(D)]*0.5;   
    
        # compute the vector v
        vseq<-seq(2,nq-2,by=2);
        vr<-2/(1-vseq^2);
        vr<-c(1,vr,1/(1-nq*nq));
        v<-matrix(vr,ncol=1);  # v is a N by 1 matrix
    
        # compute the vector w, length(w)=nq/2+1
    
        h<-function(x,ul,uk)
         {
          ((b-a)/2)*(exp((b-a)/2*x+(a+b)/2)+1)^(1i*uk)*cos(((b-a)/2*x+(a+b)/2-a)*ul)
         }
    
         w<-matrix(rep(NA,length(v)),ncol=1);
    
         for(i in 1:length(w))
          {
            w[i]<-h((cos((i-1)*pi/nq)),ul,uk)+h((-cos((i-1)*pi/nq)),ul,uk)
          }
    
          res<-t(t(D)%*%v)%*%w; # each element of matrix M
    
          return(res)
          }
    
       matrix.M<-matrix(0,ncol = N,nrow = N);
    
       for(i in 1:N-1)
        for(j in 1:N-1)
       {
        matrix.M[i,j]<-myfun(a,b,nq,i-1,j-1)
       }
    
       a<--173.2;
       b<-78;
       alpha<-0.24;
       Dt<-0.1;
       M<-1000;
       N<-150;
       u<-seq(1,150,by=1)*pi/(b-a);
       nq<-3000;
    
    ## Use outer to compute the elements of the matrix
    D <- outer(1:length(k), 1:length(m), function(i, j) {(2/nq)*cos(((j-1)*(i-1)*pi)/(nq*0.5))} )
    
    D[,1]<-D[,1]*0.5;
    D[,ncol(D)]<-D[,ncol(D)]*0.5;
    
                                        # compute the vector v                                                                             
    vseq<-seq(2,nq-2,by=2);
    vr<-2/(1-vseq^2);
    vr<-c(1,vr,1/(1-nq*nq));
    v<-matrix(vr,ncol=1);  # v is a N by 1 matrix                                                                                          
    
    h<-function(x,ul,uk) {
        ((b-a)/2)*(exp((b-a)/2*x+(a+b)/2)+1)^(1i*uk)*cos(((b-a)/2*x+(a+b)/2-a)*ul)
    }
    
    ## Compute the full w vector in one go    
    vect <- seq_along(v)-1
    w <- h((cos(vect*pi/nq)),ul,uk) + h((-cos(vect*pi/nq)),ul,uk)
    
    ## Compute the cross products. 
    res <- crossprod(crossprod(D, v), w)
    
    return(res)