三角行列の要素を与えて対称行列を作る     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

Made with Macintosh