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 に答える