4

我有一个三角矩阵,想有效地循环所有元素。有没有一种我根本看不到的聪明方法?

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

        [,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()对该矩阵中位于主对角线下方(上方)的元素执行一些功能。(背景:我知道我有一个对称矩阵,想要执行一些耗时的数据操作,我想“镜像”我的矩阵)

4

1 回答 1

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)]      
于 2012-07-16T17:19:53.483 回答