我有一个三角矩阵,想要有效地遍历所有元素。有一种我根本看不到的智能方式吗?
所以这是我的矩阵的一个小例子
[,1] [,2] [,3] [,4]
[1,] 1 0 0 0
[2,] 2 1 0 0
[3,] 3 7 1 0
[4,] 4 4 10 1
我想要做的是对此矩阵中位于主对角线下方(上方)的元素执行一些函数f()
。 (背景:我知道我有一个对称矩阵,想要执行一些耗时的数据操作,我想'镜像'我的矩阵)
答案 0 :(得分:3)
如下所示,lower.tri()
和upper.tri()
提供了一种表达(和快速)方法,用于提取和替换相关扇区中的元素矩阵。由于与索引操作相比,您应用于元素的函数可能很慢,因此搜索更快的索引选项(或尝试避免单次调用t()
)可能没有意义。
## Example data
m <- matrix(c(1,2,3,4,0,1,7,4,0,0,1,10,0,0,0,1), ncol=4)
## Example of a slow function
slowFun <- function(x) sapply(x, function(x) {Sys.sleep(0.1); x^2})
## Proposed strategy
m[lower.tri(m)] <- slowFun(m[lower.tri(m)])
m[upper.tri(m)] <- t(m)[upper.tri(m)]