我试图加快我的代码,因为它的运行时间很长。我已经找到了问题所在。请考虑以下示例:
x<-c((2+2i),(3+1i),(4+1i),(5+3i),(6+2i),(7+2i))
P<-matrix(c(2,0,0,3),nrow=2)
out<-sum(c(0.5,0.5)%*%mtx.exp(P%*%(matrix(c(x,0,0,x),nrow=2)),5))
我有一个复数值的向量x,向量有12 ^ 11个条目,然后我想计算第三行的总和。 (我需要函数mtx.exp,因为它是一个复杂的矩阵幂(函数在包Biodem中)。我发现%^%函数不支持复杂的参数。)
所以我的问题是,如果我尝试
sum(c(0.5,0.5)%*%mtx.exp(P%*%(matrix(c(x,0,0,x),nrow=2)),5))
我收到一个错误:&#34;错误在pot%*%pot:不一致的参数。&#34;所以我的解决方案是使用循环:
tmp<-NULL
for (i in 1:length(x)){
tmp[length(tmp)+1]<-sum(c(0.5,0.5)%*%mtx.exp(P%*%matrix(c(x[i],0,0,x[i]),nrow=2),5))
}
但如上所述,这需要很长时间。您对如何加快代码有任何想法吗?我也尝试了sapply,但这只需要循环。
我希望你能帮助我,因为我必须运行这个功能大约500次,这首先尝试超过3个小时。这不是很令人满意..
非常感谢你
答案 0 :(得分:1)
可以通过预先分配矢量来加速代码,
tmp <- rep(NA,length(x))
但我真的不明白你想要计算什么:
在第一个例子中,
你试图利用非方矩阵的力量,
在第二种情况下,你正在利用对角矩阵的力量
(可以使用^
)完成。
以下似乎等同于您的计算:
sum(P^5/2) * x^5
修改
如果P
不是对角线且C
不是标量,
我认为mtx.exp( P %*% C, 5 )
没有任何简单的简化。
您可以尝试类似
的内容y <- sapply(x, function(u)
sum(
c(0.5,0.5)
%*%
mtx.exp( P %*% matrix(c(u,0,0,u),nrow=2), 5 )
)
)
但如果您的矢量确实有12 ^ 11个条目, 这将花费很长时间。
或者,因为你有一个非常大的数字
非常小的(2 * 2)矩阵,
您可以明确地计算产品P %*% C
和它的第五种力量(使用一些计算机代数系统:
Maxima,Sage,Yacas,Maple等)
并使用结果公式:
这些只是(50行)对矢量的直接操作。
/* Maxima code */
p: matrix([p11,p12], [p21,p22]);
c: matrix([c1,0],[0,c2]);
display2d: false;
factor(p.c . p.c . p.c . p.c . p.c);
然后我将结果复制并粘贴到R:
中c1 <- dnorm(abs(x),0,1); # C is still a diagonal matrix
c2 <- dnorm(abs(x),1,3);
p11 <- P[1,1]
p12 <- P[1,2]
p21 <- P[2,1]
p22 <- P[2,2]
# Result of the Maxima computations:
# I just add all the elements of the resulting 2*2 matrix,
# but you may want to do something slightly different with them.
c1*(c2^4*p12*p21*p22^3+2*c1*c2^3*p11*p12*p21*p22^2
+2*c1*c2^3*p12^2*p21^2*p22
+3*c1^2*c2^2*p11^2*p12*p21*p22
+3*c1^2*c2^2*p11*p12^2*p21^2
+4*c1^3*c2*p11^3*p12*p21+c1^4*p11^5)
+
c2*p12
*(c2^4*p22^4+c1*c2^3*p11*p22^3+3*c1*c2^3*p12*p21*p22^2
+c1^2*c2^2*p11^2*p22^2+4*c1^2*c2^2*p11*p12*p21*p22
+c1^3*c2*p11^3*p22+c1^2*c2^2*p12^2*p21^2
+3*c1^3*c2*p11^2*p12*p21+c1^4*p11^4)
+
c1*p21
*(c2^4*p22^4+c1*c2^3*p11*p22^3+3*c1*c2^3*p12*p21*p22^2
+c1^2*c2^2*p11^2*p22^2+4*c1^2*c2^2*p11*p12*p21*p22
+c1^3*c2*p11^3*p22+c1^2*c2^2*p12^2*p21^2
+3*c1^3*c2*p11^2*p12*p21+c1^4*p11^4)
+
c2*(c2^4*p22^5+4*c1*c2^3*p12*p21*p22^3
+3*c1^2*c2^2*p11*p12*p21*p22^2
+3*c1^2*c2^2*p12^2*p21^2*p22
+2*c1^3*c2*p11^2*p12*p21*p22
+2*c1^3*c2*p11*p12^2*p21^2+c1^4*p11^3*p12*p21)