目的 三角行列の要素を与えて対称行列を作る 使用法 tri.mat(x, n=floor(sqrt(1+8*length(x))-1)/2, byrow=TRUE, lower=TRUE) 引数 x 対角成分を含む三角行列の要素 n 指定不要(対称行列のサイズは x の長さから計算され,チェックされる) byrow x が行優先で使用されるとき TRUE(例を参照) lower x が下三角行列のとき TRUE(例を参照) ソース インストールは,以下の 1 行をコピーし,R コンソールにペーストする source("http://aoki2.si.gunma-u.ac.jp/R/src/tri-mat.R", encoding="euc-jp") # 三角行列の要素を与えて対称行列を作る tri.mat <- function( x, # 対角成分を含む三角行列の要素 n=floor(sqrt(1+8*length(x))-1)/2, # 指定不要(対称行列のサイズ) byrow=TRUE, # x が行優先で使用されるとき TRUE lower=TRUE) # x が下三角行列のとき TRUE { stopifnot(length(x) == n*(n+1)/2) # 要素数に過不足がないかチェック mat <- diag(n) # 正方行列を作る mat[(if (xor(byrow, lower)) lower.tri else upper.tri)(mat, diag=TRUE)] <- x mat <- t(mat)+mat diag(mat) <- diag(mat)/2 return(mat) } 使用例 tri.mat(1:15) tri.mat(1:15, byrow=TRUE, lower=TRUE) tri.mat(1:15, byrow=TRUE, lower=FALSE) tri.mat(1:15, byrow=FALSE, lower=TRUE) tri.mat(1:15, byrow=FALSE, lower=FALSE) 出力例 > tri.mat(1:15) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 4 7 11 [2,] 2 3 5 8 12 [3,] 4 5 6 9 13 [4,] 7 8 9 10 14 [5,] 11 12 13 14 15 > tri.mat(1:15, byrow=TRUE, lower=TRUE) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 4 7 11 [2,] 2 3 5 8 12 [3,] 4 5 6 9 13 [4,] 7 8 9 10 14 [5,] 11 12 13 14 15 > tri.mat(1:15, byrow=TRUE, lower=FALSE) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 2 6 7 8 9 [3,] 3 7 10 11 12 [4,] 4 8 11 13 14 [5,] 5 9 12 14 15 > tri.mat(1:15, byrow=FALSE, lower=TRUE) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 3 4 5 [2,] 2 6 7 8 9 [3,] 3 7 10 11 12 [4,] 4 8 11 13 14 [5,] 5 9 12 14 15 > tri.mat(1:15, byrow=FALSE, lower=FALSE) [,1] [,2] [,3] [,4] [,5] [1,] 1 2 4 7 11 [2,] 2 3 5 8 12 [3,] 4 5 6 9 13 [4,] 7 8 9 10 14 [5,] 11 12 13 14 15