求助关于矩阵的运算,望各位赐教

18983785491 |浏览893次
收藏|2017/08/09 11:15

 mat0
     [,1] [,2] [,3] [,4]
[1,]  488  500  504  500
[2,]  488  502  505  476
mat0是定义的一个矩阵,我想求mat0的每个元素的R_aij <- mat0[i,j] - mean_row[i] - mean_col[j] + mean_aij,

这里mean_row[i]是mat0第i行的均值,mean_col[j]是mat0第j列的均值,mean_aij是整个mat0的均值,用上面的公式需要两个for循环,for循环运算时间比较长


for循环代码如下

mean_row <- rowMeans(mat0); #行的均值
    l_mean_row <- as.list(mean_row);#将行的均值放入到列表
    mean_col <- colMeans(mat0)     #列的均值
    l_mean_col <- as.list(mean_col) #将列的均值放到列表

    mean_aij <- mean(mat0); #矩阵均值
    sum1 <- 0;
    for (i in 1:nrow(mat0))
    {
            sum2 <- 0;
        for (j in 1:ncol(mat0))
        {
            R_aij <- mat0[i,j] - l_mean_row[[i]] - l_mean_col[[j]] + mean_aij  #R(aij)的公式
                  sum2 <- sum2 + R_aij  
                 
        }
           sum1 <- sum1 + sum2
           
    } 

我想用apply函数简化运算

R <- apply(mat0, 2, function(mat0) mat0 - mean_row - mean_col[j] + mean_aij )


我遇到的问题是我想按矩阵的列计算每个元素的R_aij,但是在运用上面自定义函数进行运算时每列都应用相同的mean_col[j]。我想要的是按列计算,计算第一列使用mean_col[1],第二列使用mean_col[2].


满意回答

2017/08/09 20:48

R_aij <- t(t(mat0 - rowMeans(mat0)) - colMeans(mat0)) + mean(mat0) lz试一下,应该是你想要的。R的一个进阶就是vectorization,vectorized的code执行起来会快很多~

foozhencheng

其他回答(1)    我来补答
  • R_aij <- t(t(mat0 - rowMeans(mat0)) - colMeans(mat0)) + mean(mat0) lz试一下,应该是你想要的。R的一个进阶就是vectorization,vectorized的code执行起来会快很多~
    回答于 2017/08/09 15:49
  • R_aij <- t(t(mat0 - rowMeans(mat0)) - colMeans(mat0)) + mean(mat0) lz试一下,应该是你想要的。R的一个进阶就是vectorization,vectorized的code执行起来会快很多~
    回答于 2017/08/09 15:49
1人关注该问题
+1
 加载中...