避免嵌套的for循环用于棘手的操作R.

时间:2018-01-21 19:13:09

标签: r loops matrix

我必须做一个涉及两个矩阵的操作,矩阵#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
  }

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

看起来你只是在进行矩阵 - 向量乘法。在R中,使用%*%运算符,因此所有循环都被委托给fortran例程。我认为它等同于以下

apply(lo, 2, function(x) dat %*% x)

您可以通过在循环外部移动nom <-赋值来改进代码,因为它会在每次迭代时重新计算相同的内容。另外,在每次迭代期间计算SC1的重点是什么?