2

行列とベクトルがあるとします:

set.seed(999)
mat = matrix(round(rnorm(24,4,9)),3,8)
mat
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    6  -13   -6   12   -8   12   10
[2,]   -8    2   -7   16    6    5  -15    1
[3,]   11   -1   -5    5   13    5   -7    7

vec = c(1,5, 4,4, 2,1, 4,8) 

ここで、 の各行について、その行と の2 つの要素を「グループ」として持つmatの間の距離を計算したいと考えています。vecたとえば、私はしたいです

d11 = |mat[1,1:2] - vec[1:2]|
d12 = |mat[1,3:4] - vec[3:4]|
d13 = |mat[1,5:6] - vec[5:6]|
d14 = |mat[1,7:8] - vec[7:8]|

の残りの行mat(つまり、行 2 と 3) に対しても同じことが行われますd21,...,d24, d31,...,d34

このタスクが for ループを使用せずに実行できることを願っています。この目的のために直接使用できる機能はありますか? ありがとう!

4

1 に答える 1

2

私はこれがうまくいくと思います:

s1 <- sweep(mat,2,vec,"-")  ## subtract vec
s2 <- s1^2                  ## square
s3 <- cbind(s2[col(s2) %% 2 ==1],s2[col(s2) %% 2 ==0])  ## stack
s4 <- rowSums(s3)
s5 <- matrix(s4,nrow=3)  ## restack
##      [,1] [,2] [,3] [,4]
## [1,]    1  389  181   68
## [2,]   90  265   32  410
## [3,]  136   82  137  122

ステップ 3 を実行するためのより良い方法があるかもしれませんが、残りは最適に近いようです。(おそらくステップ 1 を のように少し高速化できますがt(t(mat)-vec)、私は読みやすさを優先sweepします。)

于 2013-03-14T02:46:24.610 に答える