如何用矩阵进行指数计算?

时间:2014-11-09 05:41:49

标签: r calculated-columns exponential

我想用矩阵和向量计算指数。矩阵如下

 ID     var_0     var_01    var_02   var_03 
 1        1         2        3        4
 2        5         6        7        8
 3        9         10       11       12
 ...

和向量是(0.1,0.2,0.3,0.4)

我想得到如下结果

 ID       var_0   var_01     var_02   var_03 
 1        1^0.1     2^0.2    3^0.3    4^0.4
 2        5^0.1     6^0.2    7^0.3    8^0.4
 3        9^0.1     10^0.2   11^0.3    12^0.4
 ...

也就是说,我想为每个ID获取(ith var)^ ith矢量

4 个答案:

答案 0 :(得分:5)

您可以使用R的矢量回收。转置矩阵,以便以正确的顺序应用功率计算,然后转置回来。

(m <- matrix(1:12, nrow=3, ncol=4, byrow=TRUE))
#       [,1] [,2] [,3] [,4]
# [1,]    1    2    3    4
# [2,]    5    6    7    8
# [3,]    9   10   11   12

p <- 1:4

t(t(m)^p)
#       [,1] [,2] [,3]  [,4]
# [1,]    1    4   27   256
# [2,]    5   36  343  4096
# [3,]    9  100 1331 20736

答案 1 :(得分:2)

您可以使用sweep功能执行此操作。签名是

sweep(x, MARGIN, STATS, FUN)

此函数根据您设置x的方式迭代部分MARGIN。在每次迭代中,x的当前部分和整个参数STATS将传递给FUN,这应该是一个带有2个参数的函数。

MARGIN设置为1意味着STATSx(维度1)的行对齐,2表示STATSx的列对齐}(维度2)。其他变化也是可能的。

因此,对于您的特定示例,请使用

sweep(your.matrix, 2, your.exponents, `^`)

编辑:根据@ david-arenburg的回答,您可能不应该使用sweep。我不知道它太慢了!

答案 2 :(得分:2)

或者你可以做(​​来自@ user20650的帖子的数据)

 m^p[col(m)]
 #    [,1] [,2] [,3]  [,4]
 #[1,]    1    4   27   256
 #[2,]    5   36  343  4096
 #[3,]    9  100 1331 20736

答案 3 :(得分:2)

或者(使用@ user20650的数据集)

m^rep(p, each = nrow(m))
#      [,1] [,2] [,3]  [,4]
# [1,]    1    4   27   256
# [2,]    5   36  343  4096
# [3,]    9  100 1331 20736

另一个选择

m ^ matrix(p, nrow(m), ncol(m), byrow = TRUE)
#      [,1] [,2] [,3]  [,4]
# [1,]    1    4   27   256
# [2,]    5   36  343  4096
# [3,]    9  100 1331 20736

更大数据集的一些基准测试。好像我的两个答案和@akruns衡量最好的

n <- 1e6
cols <- 100
m <- matrix(seq_len(n), nrow = n, ncol = cols)
p <- seq_len(cols)

user20650 = function() {t(t(m)^p)}
Nick =  function() {sweep(m, 2, p, `^`)}
akrun = function() {m^p[col(m)]}
David1 = function() {m^rep(p, each = nrow(m))}
David2 = function() {m ^ matrix(p, nrow(m), ncol(m), byrow = TRUE)}

library(microbenchmark)
Res <- microbenchmark(
               user20650() ,
               Nick(),
               akrun(),
               David1(),
               David2() 
)

Res

# Unit: seconds
       # expr       min        lq    median        uq       max neval
# user20650()  9.692392  9.800470  9.878385 10.010198 11.002012   100
#      Nick() 10.487660 10.595750 10.687573 10.896852 14.083319   100
#     akrun()  8.213784  8.316646  8.395962  8.529671  9.325273   100
#    David1()  9.115449  9.219430  9.304380  9.425614 10.445129   100
#    David2()  8.157632  8.275277  8.335884  8.437017  9.348252   100

boxplot(Res)

enter image description here