我必须做一个涉及两个矩阵的操作,矩阵#1带数据,矩阵#2带系数乘以矩阵#1的列
矩阵#1是:
dim(dat)
[1] 612 2068
dat[1:6,1:8]
X0005 X0010 X0011 X0013 X0015 X0016 X0017 X0018
1 1.96 1.82 8.80 1.75 2.95 1.10 0.46 0.96
2 1.17 0.94 2.74 0.59 0.86 0.63 0.16 0.31
3 2.17 2.53 10.40 4.19 4.79 2.22 0.31 3.32
4 3.62 1.93 6.25 2.38 2.25 0.69 0.16 1.01
5 2.32 1.93 3.74 1.97 1.31 0.44 0.28 0.98
6 1.30 2.04 1.47 1.80 0.43 0.33 0.18 0.46
和矩阵#2是:
dim(lo)
[1] 2068 8
head(lo)
i1 i2 i3 i4 i5 i6
X0005 -0.11858852 0.10336788 0.62618771 0.08706041 -0.02733101 0.006287923
X0010 0.06405406 0.13692216 0.64813610 0.15750302 -0.13503956 0.139280709
X0011 -0.06789727 0.30473549 0.07727417 0.24907723 -0.05345123 0.141591330
X0013 0.20909664 0.01275553 0.21067894 0.12666704 -0.02836527 0.464548147
X0015 -0.07690560 0.18788859 -0.03551084 0.19120773 -0.10196578 0.234037820
X0016 -0.06442454 0.34993481 -0.04057001 0.20258195 -0.09318325 0.130669546
i7 i8
X0005 0.08571777 0.031531478
X0010 0.31170850 -0.003127279
X0011 0.52527759 -0.065002026
X0013 0.27858049 -0.032178156
X0015 0.50693977 -0.058003429
X0016 0.53162596 -0.052091767
我想将矩阵#1的每一列乘以其对应的矩阵#2第一列的对应系数,并将所有结果列相加。然后重复操作但是系数为矩阵#2第二列,然后是第三列,依此类推......
结果是具有8列的矩阵,这是矩阵#1
中数据的线性组合我的尝试包括嵌套的for循环。它有效,但需要大约30'执行。有没有办法避免这些循环并减少计算量?
这是我的尝试:
r=nrow(dat)
n=ncol(dat)
m=ncol(lo)
eme<-matrix(NA,r,m)
for (i in(1:m)){
SC<-matrix(NA,r,n)
for (j in(1:n)){
nom<-rownames(lo)
x<-dat[ , colnames(dat) == nom[j]]
SC[,j]<-x*lo[j,i]
SC1<-rowSums(SC)
}
eme[,i]<-SC1
}
感谢您的帮助
答案 0 :(得分:0)
看起来你只是在进行矩阵 - 向量乘法。在R中,使用%*%
运算符,因此所有循环都被委托给fortran例程。我认为它等同于以下
apply(lo, 2, function(x) dat %*% x)
您可以通过在循环外部移动nom <-
赋值来改进代码,因为它会在每次迭代时重新计算相同的内容。另外,在每次迭代期间计算SC1
的重点是什么?