三角行列の要素を与えて対称行列を作る Last modified: Nov 16, 2004
目的
三角行列の要素を与えて対称行列を作る
使用法
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
直前のページへ戻る
E-mail to Shigenobu AOKI