如何用R中的向量元素划分矩阵的每一行

托梅克

我想将矩阵的每一除以固定向量。例如

mat<-matrix(1,ncol=2,nrow=2,TRUE)
dev<-c(5,10)

Givingmat/dev将每一除以dev

     [,1] [,2]
[1,]  0.2  0.2
[2,]  0.1  0.1

但是,我想将其作为结果,即按行进行操作

rbind(mat[1,]/dev, mat[2,]/dev)

     [,1] [,2]
[1,]  0.2  0.1
[2,]  0.2  0.1

有明确的命令可以到达那里吗?

G.格洛腾迪克

以下是增加代码长度的几种方法:

t(t(mat) / dev)

mat / dev[col(mat)] #  @DavidArenburg & @akrun

mat %*% diag(1 / dev)

sweep(mat, 2, dev, "/")

t(apply(mat, 1, "/", dev))

plyr::aaply(mat, 1, "/", dev)

mat / rep(dev, each = nrow(mat))

mat / t(replace(t(mat), TRUE, dev))

mapply("/", as.data.frame(mat), dev)  # added later

mat / matrix(dev, nrow(mat), ncol(mat), byrow = TRUE)  # added later

do.call(rbind, lapply(as.data.frame(t(mat)), "/", dev))

mat2 <- mat; for(i in seq_len(nrow(mat2))) mat2[i, ] <- mat2[i, ] / dev

数据框

开头的所有解决方案mat /mat可以在数据帧中工作,并产生数据帧结果。这同样也是对的情况下sweep的解决方案,最后,即mat2,解决方案。mapply解决方案可与data.frames一起使用,但会产生一个矩阵。

向量

如果mat是普通向量而不是矩阵,则这两个返回一个一列矩阵

t(t(mat) / dev)
mat / t(replace(t(mat), TRUE, dev))

然后返回一个向量:

plyr::aaply(mat, 1, "/", dev)

其他人则给出错误,警告或不希望的答案。

基准测试

代码的简洁性和清晰度可能比速度更重要,但是出于完整性的考虑,这里有一些基准测试是使用10次重复,然后使用100次重复。

library(microbenchmark)
library(plyr)

set.seed(84789)

mat<-matrix(runif(1e6),nrow=1e5)
dev<-runif(10)

microbenchmark(times=10L,
  "1" = t(t(mat) / dev),
  "2" = mat %*% diag(1/dev),
  "3" = sweep(mat, 2, dev, "/"),
  "4" = t(apply(mat, 1, "/", dev)),
  "5" = mat / rep(dev, each = nrow(mat)),
  "6" = mat / t(replace(t(mat), TRUE, dev)),
  "7" = aaply(mat, 1, "/", dev),
  "8" = do.call(rbind, lapply(as.data.frame(t(mat)), "/", dev)),
  "9" = {mat2 <- mat; for(i in seq_len(nrow(mat2))) mat2[i, ] <- mat2[i, ] / dev},
 "10" = mat/dev[col(mat)])

给予:

Unit: milliseconds
 expr         min          lq       mean      median          uq        max neval
    1    7.957253    8.136799   44.13317    8.370418    8.597972  366.24246    10
    2    4.678240    4.693771   10.11320    4.708153    4.720309   58.79537    10
    3   15.594488   15.691104   16.38740   15.843637   16.559956   19.98246    10
    4   96.616547  104.743737  124.94650  117.272493  134.852009  177.96882    10
    5   17.631848   17.654821   18.98646   18.295586   20.120382   21.30338    10
    6   19.097557   19.365944   27.78814   20.126037   43.322090   48.76881    10
    7 8279.428898 8496.131747 8631.02530 8644.798642 8741.748155 9194.66980    10
    8  509.528218  524.251103  570.81573  545.627522  568.929481  821.17562    10
    9  161.240680  177.282664  188.30452  186.235811  193.250346  242.45495    10
   10    7.713448    7.815545   11.86550    7.965811    8.807754   45.87518    10

重新测试所有耗时少于20毫秒且重复100次的测试:

microbenchmark(times=100L,
  "1" = t(t(mat) / dev),
  "2" = mat %*% diag(1/dev),
  "3" = sweep(mat, 2, dev, "/"),
  "5" = mat / rep(dev, each = nrow(mat)),
  "6" = mat / t(replace(t(mat), TRUE, dev)),
 "10" = mat/dev[col(mat)])

给予:

Unit: milliseconds
 expr       min        lq      mean    median        uq       max neval
    1  8.010749  8.188459 13.972445  8.560578 10.197650 299.80328   100
    2  4.672902  4.734321  5.802965  4.769501  4.985402  20.89999   100
    3 15.224121 15.428518 18.707554 15.836116 17.064866  42.54882   100
    5 17.625347 17.678850 21.464804 17.847698 18.209404 303.27342   100
    6 19.158946 19.361413 22.907115 19.772479 21.142961  38.77585   100
   10  7.754911  7.939305  9.971388  8.010871  8.324860  25.65829   100

因此,在这两个测试中,#2(使用diag)都是最快的。原因可能在于它对BLAS几乎直接的吸引力,而#1依赖于更昂贵的t

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从opencv的矩阵的每一行中减去向量?

来自分类Dev

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

来自分类Dev

将矩阵的每一行乘以r中的向量的好方法

来自分类Dev

使用矩阵每一行中的元素应用函数

来自分类Dev

如何跳过矩阵的每一行中的第一个元素?

来自分类Dev

如何在MATLAB中从3D矩阵的每一行中选择矢量元素?

来自分类Dev

如何在R中移动矩阵的每一行

来自分类Dev

如何绘制,其中矩阵中的每一行都是R中的线积分图

来自分类Dev

如何绘制,其中矩阵中的每一行都是R中的线积分图

来自分类Dev

将矩阵中的每一行除以向量中的相应行

来自分类Dev

我如何(有效地)将向量添加到Julia中矩阵的每一行?

来自分类Dev

在Eigen c ++中,如何将NxM矩阵的每一行乘以Nx1标量的向量?

来自分类Dev

如何获取R中矩阵每一行的加权和

来自分类Dev

如何添加矩阵的每一行?

来自分类Dev

如何将数据帧的每个元素乘以R中每一行的元素总和?

来自分类Dev

numpy通过向量减去矩阵的每一行

来自分类Dev

为矩阵的每一行计算向量的出现

来自分类Dev

为矩阵的每一行计算向量的出现

来自分类Dev

MATLAB 用给定的向量减去矩阵的每一行

来自分类Dev

如何在矩阵的每一行中分配相同的向量

来自分类Dev

如何访问矩形矩阵中的每一行和每一列

来自分类Dev

如何从R中的数据帧的每一行中选择最常出现的元素

来自分类Dev

如何在矩阵的每一行中找到数量唯一的元素?

来自分类Dev

从向量中为数据的每一行选择一个随机元素。

来自分类Dev

提取矩阵每一行中的唯一元素

来自分类Dev

Python从矩阵的每一行中减去第一个元素

来自分类Dev

在Matlab中对方形对角矩阵的每一行中的元素重新排序

来自分类Dev

从向量中每一行的指定列中提取元素

来自分类Dev

在Matlab中将最大和最小元素保留在矩阵的每一行中

Related 相关文章

  1. 1

    从opencv的矩阵的每一行中减去向量?

  2. 2

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

  3. 3

    将矩阵的每一行乘以r中的向量的好方法

  4. 4

    使用矩阵每一行中的元素应用函数

  5. 5

    如何跳过矩阵的每一行中的第一个元素?

  6. 6

    如何在MATLAB中从3D矩阵的每一行中选择矢量元素?

  7. 7

    如何在R中移动矩阵的每一行

  8. 8

    如何绘制,其中矩阵中的每一行都是R中的线积分图

  9. 9

    如何绘制,其中矩阵中的每一行都是R中的线积分图

  10. 10

    将矩阵中的每一行除以向量中的相应行

  11. 11

    我如何(有效地)将向量添加到Julia中矩阵的每一行?

  12. 12

    在Eigen c ++中,如何将NxM矩阵的每一行乘以Nx1标量的向量?

  13. 13

    如何获取R中矩阵每一行的加权和

  14. 14

    如何添加矩阵的每一行?

  15. 15

    如何将数据帧的每个元素乘以R中每一行的元素总和?

  16. 16

    numpy通过向量减去矩阵的每一行

  17. 17

    为矩阵的每一行计算向量的出现

  18. 18

    为矩阵的每一行计算向量的出现

  19. 19

    MATLAB 用给定的向量减去矩阵的每一行

  20. 20

    如何在矩阵的每一行中分配相同的向量

  21. 21

    如何访问矩形矩阵中的每一行和每一列

  22. 22

    如何从R中的数据帧的每一行中选择最常出现的元素

  23. 23

    如何在矩阵的每一行中找到数量唯一的元素?

  24. 24

    从向量中为数据的每一行选择一个随机元素。

  25. 25

    提取矩阵每一行中的唯一元素

  26. 26

    Python从矩阵的每一行中减去第一个元素

  27. 27

    在Matlab中对方形对角矩阵的每一行中的元素重新排序

  28. 28

    从向量中每一行的指定列中提取元素

  29. 29

    在Matlab中将最大和最小元素保留在矩阵的每一行中

热门标签

归档