Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从r中矩阵的每一行中减去一个常量向量_R_Vector_Matrix - Fatal编程技术网

从r中矩阵的每一行中减去一个常量向量

从r中矩阵的每一行中减去一个常量向量,r,vector,matrix,R,Vector,Matrix,我有一个5列4行的矩阵。我还有一个3列的向量。我想在矩阵的每一行分别从第3、4和5列中减去向量中的值 b <- matrix(rep(1:20), nrow=4, ncol=5) [,1] [,2] [,3] [,4] [,5] [1,] 1 5 9 13 17 [2,] 2 6 10 14 18 [3,] 3 7 11 15 19 [4,] 4 8 12 16 20 c <

我有一个5列4行的矩阵。我还有一个3列的向量。我想在矩阵的每一行分别从第3、4和5列中减去向量中的值

b <- matrix(rep(1:20), nrow=4, ncol=5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

c <- c(5,6,7)

也许没有那么优雅,但是

b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5,6,7)

b[,3:5] <- t(t(b[,3:5])-x)
还有。在这里,我们将子集划分两次,并使用第二个子集为
x
中的每个值获取正确的列,因为这两个矩阵将以相同的顺序索引

我想我最喜欢的是@thelatemail链接的问题

b[,3:5] <- sweep(b[,3:5], 2, x, `-`)
b[,3:5]一个简单的解决方案:

b <- matrix(rep(1:20), nrow=4, ncol=5)
c <- c(5,6,7)

for(i in 1:nrow(b)) {
  b[i,3:5] <- b[i,3:5] - c
}

b另一种方式,使用apply:

b[,3:5] <- t(apply(b[,3:5], 1, function(x) x-c))

b[,3:5]这正是
sweep
的目的:

b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5,6,7)

b[,3:5] <- sweep(b[,3:5], 2, x)
b

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    5    4    7   10
#[2,]    2    6    5    8   11
#[3,]    3    7    6    9   12
#[4,]    4    8    7   10   13
这可以通过非常令人满意的方式完成(使用其(类似numpy的)广播
-
操作员
%b-%
):


遗憾的是,复制中最快的解决方案(
mat%*%diag(1/dev)
)无法轻松转换为减法<代码>(mat%*%diag(1/dev)-1)%*%diag(dev)
与双转置相比既难看又慢:\
b[,3:5] <- t(apply(b[,3:5], 1, function(x) x-c))
b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5,6,7)

b[,3:5] <- sweep(b[,3:5], 2, x)
b

#     [,1] [,2] [,3] [,4] [,5]
#[1,]    1    5    4    7   10
#[2,]    2    6    5    8   11
#[3,]    3    7    6    9   12
#[4,]    4    8    7   10   13
sweep(b, 2, c(0,0,x))
#install.packages("rray")
library(rray)

b <- matrix(rep(1:20), nrow=4, ncol=5)
x <- c(5, 6, 7)

b[, 3:5] <- b[, 3:5] %b-% matrix(x, 1)
b
#>      [,1] [,2] [,3] [,4] [,5]
#> [1,]    1    5    4    7   10
#> [2,]    2    6    5    8   11
#> [3,]    3    7    6    9   12
#> [4,]    4    8    7   10   13
#install.packages("bench")
res <- bench::press(
  size = c(10, 1000, 10000),
  frac_selected = c(0.1, 0.5, 1),
  {
  B <- matrix(sample(size*size), nrow=size, ncol=size)
  B2 <- B
  x <- sample(size, size=ceiling(size*frac_selected))
  idx <- sample(size, size=ceiling(size*frac_selected))

  bench::mark(rray = {B2[, idx] <- B[, idx, drop = FALSE] %b-% matrix(x, nrow = 1); B2}, 
              sweep = {B2[, idx] <- sweep(B[, idx, drop = FALSE], MARGIN = 2, x); B2}
  )
  }
)
plot(res)