如何有效地循环三角矩阵

时间:2012-07-16 16:59:17

标签: r for-loop

我有一个三角矩阵,想要有效地遍历所有元素。有一种我根本看不到的智能方式吗?

所以这是我的矩阵的一个小例子

        [,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()。 (背景:我知道我有一个对称矩阵,想要执行一些耗时的数据操作,我想'镜像'我的矩阵)

1 个答案:

答案 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)]