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