首页 > 解决方案 > 同时将矩阵的每个元素应用于 R 中的函数

问题描述

我模拟了三个矩阵,希望实现一个功能。

很难解释这个函数,但我认为 FOR LOOP 的以下代码很好,很容易解释我想做的事情。

A=matrix(1:10000,100,100)
B=matrix(2:10001,100,100)
C=matrix(3:10002,100,100)

for (i in 1:100) {
  for (j in 1:100) {
    print(min(C[B>A[i,j]]))
  }
}

但是,实际上每个的矩阵会大得多,例如 1000 * 1000,导致 FOR LOOP 消耗大量时间。我在二维中尝试了 apply(),但根据 system.time(),它根本没有改进。

apply(A, 1:2, function(x) print(min(C[B>x])))

我想知道是否有任何方法可以优化此功能以使其更快,或者简而言之,同时使用矩阵 A 的每个元素。

非常感谢先进!

标签: rfor-loopmatrixapply

解决方案


为了使您的示例易于管理和理解,我减少了矩阵的维度。

A=matrix(1:10,2,5)
B=matrix(2:11,2,5)
C=matrix(3:12,2,5)

运行你的函数给出:

for (i in 1:2) {
   for (j in 1:5) {
     print(min(C[B>A[i,j]]))
   }
}

#[1] 3
#[1] 5
#[1] 7
#[1] 9
#[1] 11
#[1] 4
#[1] 6
#[1] 8
#[1] 10
#[1] 12

我们可以sapply在 的每个元素上对此进行测试A,然后如果需要,将其转换为与 的维数相同的矩阵A

out <- sapply(A, function(x) min(C[B > x]))
dim(out) <- dim(A)

out
#     [,1] [,2] [,3] [,4] [,5]
#[1,]    3    5    7    9   11
#[2,]    4    6    8   10   12

推荐阅读