如何使用一些apply函数来解决R中需要两个for循环的问题

wen*_*wen 6 for-loop r apply

我有一个名为"mat"的矩阵和一个名为"center"的较小矩阵.

temp = c(1.8421,5.6586,6.3526,2.904,3.232,4.6076,4.8,3.2909,4.6122,4.9399)
mat = matrix(temp, ncol=2)
       [,1]   [,2]
[1,] 1.8421 4.6076
[2,] 5.6586 4.8000
[3,] 6.3526 3.2909
[4,] 2.9040 4.6122
[5,] 3.2320 4.9399

center = matrix(c(3, 6, 3, 2), ncol=2)

     [,1] [,2]
[1,]    3    3
[2,]    6    2
Run Code Online (Sandbox Code Playgroud)

我需要计算每排垫子与每排中心之间的距离.例如,mat [1,]和center [1,]的距离可以计算为

diff = mat[1,]-center[1,]
t(diff)%*%diff
        [,1]
[1,] 3.92511
Run Code Online (Sandbox Code Playgroud)

同样,我可以找到mat [1,]和center [2,]的距离

diff = mat[1,]-center[2,]
t(diff)%*%diff
         [,1]
[1,] 24.08771
Run Code Online (Sandbox Code Playgroud)

对于每排垫子重复这个过程,我最终会结束

          [,1]      [,2]
[1,]  3.925110 24.087710
[2,] 10.308154  7.956554
[3,] 11.324550  1.790750
[4,]  2.608405 16.408805
[5,]  3.817036 16.304836
Run Code Online (Sandbox Code Playgroud)

我知道如何使用for循环实现它.我真的希望有人可以通过某种apply()函数告诉我如何使用它,也许mapply()我想.

谢谢

Ren*_*rop 1

这将解决它

t(apply(mat,1,function(row){
  d1<-sum((row-center[1,])^2)
  d2<-sum((row-center[2,])^2)
  return(c(d1,d2))
}))
Run Code Online (Sandbox Code Playgroud)

结果:

          [,1]      [,2]
[1,]  3.925110 24.087710
[2,] 10.308154  7.956554
[3,] 11.324550  1.790750
[4,]  2.608405 16.408805
[5,]  3.817036 16.304836
Run Code Online (Sandbox Code Playgroud)