lazy.symbolic_JPH {lazy.symbolic} | R Documentation |
lazy.symbolic: Collection of some useful symbolic tools for lazy boys and girls 記号演算のための関数群
Description
English help file: lazy.symbolic
Details
記号行列 (Semi symbolic matrix) とは、文字列を要素として持つ行列のことである。
完全記号行列 (Fully symbolic matrix) 行列と見なされる文字列を
要素として持つ行列のことである。
完全記号行列は TRUE の値を持つ fullsymb
という attribute を持つ。
記号行列 (semi-symbolic matrix) の操作
-
行列の生成:
-
demomat: 記号行列または完全記号行列の生成 (in lazy.tools)
-
gen_random_expr: 記号行列を含む式の生成
-
基本演算子:
(より自然な演算子に関しては modify_math_operators_JPH を参照のこと。) -
Plus or %p%: 加算 (+)
-
Minus or %m%: 減算 (-)
-
Times or %t%: 要素ごとの掛け算 (*)
-
matTimes or %T%: 掛け算 (%*%)
-
matKTimes or %@%: クロネッカー積 (%@%)
-
tp: 完全記号行列 (fully symbolic matrix) の転置 (t)
-
modify_math_operators 数値演算子の拡張
この関数を実行することにより、上記の括弧の中の演算子が記号行列を 取り扱えるようになる。
拡張された数値演算子の例はここ: (SymbolicOps_JPH)
-
逆行列の計算:
-
matSweep: Sweep 演算子を用いる方法
-
invGE: ガウスの消去法を用いる方法
-
Inv: 上記の二つの方法を選べる関数
-
行列式の計算:
-
Det: Sweep 演算子を用いる方法
-
DetL: ラプラス展開を用いる方法
-
記号行列の要素に数値を代入するための関数:
-
matReplace: 記号行列の要素に数値を代入
-
Eval: 記号行列の要素に数値を代入して評価
-
Utility Functions:
-
Simplify: 式の単純化 (かなり原始的な方法)
-
Expand: 掛け算の分配
-
add_paren: 式を括弧で囲む
-
locbalpar: 対応する括弧を探す
-
analyze_expr: 式の構造を表示する
-
nterms: 項の数を数える
-
find_terms: 式を加算的な項に分解する
-
find_factors: 式を乗算的な因子に分解する
-
find_varfunc: 式中の変数と関数を表示
-
is_valid: 文字列が式と見なせるか否かの検証
-
Mathematica 的な演算子:
-
%//% パイプ演算子
-
%/.% 後置の置換演算子
-
総和記号の演算:
-
mat2sum: 完全記号行列の式の要素を 総和記号を用いて表現する。
-
sumEval: 総和記号の添字に数値を代入
-
sumExpand: 総和記号の展開
-
sumMoveIn: 総和記号を右へ移動する
-
sumMoveOut: 総和記号を左へ移動する
-
sumSimplify: 総和記号を含む式の簡略化
-
クロネッカー積の操作:
-
KP:
A %@% B
の i-j 要素の表示 -
tr2vecK: 複数の行列の積のトレースの Kronecker 積による表現
-
vec2vecK: 3つの行列の積をベクトル化したものの Kronecker 積による表現
他のパッケージで記号行列を扱える関数
-
from lazy.tools:
-
demomat: 記号行列または完全記号行列の生成
-
Printm: 複数行列の名前付き印刷
-
Printb: ブロック行列(分割行列)の印刷
-
from lazy.mat:
-
b_diag: ブロック対角行列の生成
-
Diag: 対角行列の生成
-
pmat: 並べ替え行列の生成
-
Kmat: vec(A) を vec(t(A)) に変換する行列の生成
-
repmat: 行列を縦方向に複製する
-
ssq: 要素の2乗和
-
tr: 行列のトレース. (modified in lazy.symbolic)
-
transp: 行列や配列の転置
-
vec: 行列のベクトル化
-
vecdiag: 行列の対角要素の抽出
-
vech: 行列の非対角要素の抽出
-
vechindex: vech(A) と A の相互変換のための添字の生成
-
vechinv: vech(A) から A を復元
-
vecvecindex: vec(A) と vec(t(A)) の相互変換のための添字の生成
-
supermat: SMdim 属性を持つ超行列の生成
-
getSM: 超行列の要素の抽出
-
modSM<-: 超行列の要素への代入
-
Mh2Mv: 横に並べた行列を縦に並べ替える関数
-
Mv2Mh: 縦に並べた行列を横に並べ替える関数
Examples
# 行列やベクトルの定義
P=demomat(2,2,root="p")
Q=demomat(2,2,root="q")
R=demomat(3,3,root="r")
A=demomat(3,2,root="a")
B=demomat(3,2,root="b")
C=demomat(2,3,root="c")
v2=demomat(2,1,root="v", vec=1)
v3=demomat(3,1,root="v", vec=1)
one2=matrix(1,2,1) # numeric
one3=matrix(1,3,1) # numeric
Printm(P,Q, R, A, B, C)
Printm( v2,v3,one2,one3)
# 通常の R のベクトル
vec2=c("c1","c2")
vec3=c("c1","c2", "c3")
# 転置
t(A)
# トレース
tr(P)
# 対角行列と対角要素
Diag(P)
diag(P)
# 2項演算子
# Note that symbolic operators have EQUAL precedence. Use ( ).
# スカラーを含む演算
1 %p% A
2 %t% v2
3 %t% A
B %T% 4
# ベクトルの加算・減算
v2 %p% v2
v2 %m% v2
# 行列の加算・減算
A %p% B
A %m% B
# 行列 x ベクトル
A %T% v2
t(v3) %T% A
# 行列 x ベクトル
A %T% one2
t(one3) %T% A
# 行列 x 行列
P %T% Q
Q %T% P
# 行列 x 行列
A %T% C
C %T% A
# 行列の列の定数倍
A %T% Diag(P)
# 行列の行の定数倍
Diag(R) %T% A
# 列の並べ替え
A %T% pmat(2,1,2)
# 行の並べ替え
pmat(3,1,2) %T% A
# 加算演算子と乗算演算子の優先順位は同じなので注意が必要
P %p% (t(A)%T%B)
# error
# P %p% t(A)%T%B
# 直交行列
temp <- " cos(theta) -sin(theta)
sin(theta) cos(theta)"
T <- cards(temp)
T <- matrix(unlist(T),2,2)
Expand(T,simplify=0)
tTT <- t(T) %T% T
Eval(tTT,theta=0)
Eval(tTT,theta=0, check=0)
# 平面回転 planar rotation
temp <- "
1 0 0
0 cos(theta1) -sin(theta1)
0 sin(theta1) cos(theta1) "
Tx <- matrix(unlist(cards(temp)),3,3)
temp <- "
cos(theta2) 0 -sin(theta2)
0 1 0
sin(theta2) 0 cos(theta2) "
Ty <- matrix(unlist(cards(temp)),3,3)
temp <- "
cos(theta3) -sin(theta3) 0
sin(theta3) cos(theta3) 0
0 0 1 "
Tz <- matrix(unlist(cards(temp)),3,3)
# 平面回転 planar rotation
T <- Tx %T% Ty %T% Tz
T <- Simplify(T)
Tn <- Eval(T, values="theta1=1; theta2=2; theta3=3", check=0)
# see if T is orthonormal
t(Tn) %*% Tn %//% fuzz
Tn %*% t(Tn) %//% fuzz
# 行列の積の転置: t(PQ) == t(Q) t(P)
tPQ <- t( P%T%Q )
tQtP <- t(Q)%T%t(P)
Eval( tPQ%m%tQtP, P=demomat(2,2), Q=demomat(2,2))
# アダマール積
A %t% B
v2 %t% v2
# クロネッカー積
A %@% B
one2 %@% P
diag(3) %@% P
b_diag( P,P,P)
# R のベクトルの積
vec3 %t% A
A %t% vec3
vec2 %t% A
# 2 x 2 行列の逆行列
Pinv <- Inv(P)
PinvP <- Pinv %T% P
Eval(PinvP, P=demomat(2,2))
# 3 x 3 行列の逆行列の数値的検証
Rinv <- Inv(R)
RRinv <- R %T% Rinv
Eval( RRinv, R=matrix(runif(3*3),3) ) # Cannot use demomat(3,3) here.
# ガウスの消去法
invR <- invGE(R, print=1)[,-c(1:3)]
RinvR <- R %T% invR
Eval( RinvR, R=matrix(runif(3*3),3) ) # Cannot use demomat(3,3) here.
# 対角行列の逆行列
Inv(Diag(R))
# 下三角行列の逆行列: n x n
n <- 3
LT <- demomat(n,n,root="t", shape="lowert")
LTn <- demomat(n,n)
invLT <- Inv(LT, simplify=0)
invLT <- Expand(invLT)
LTinvLT <- LT%T%invLT
Simplify(Expand(LTinvLT))
Eval(LTinvLT,LT=LTn)
# 転置行列の逆行列: Inv(t(P)) = t(Inv(P))
invtP <- Inv(t(P))
tinvP <- t(Inv(P))
Print(invtP,"\n",tinvP)
Eval(invtP%m%tinvP, P=demomat(2,2), Q=demomat(2,2))
# 行列の積の逆行列: Inv(PQ) == Inv(Q) Inv(P)
invPQ <- Inv(P%T%Q)
invQinvP <- Inv(Q)%T%Inv(P)
dif <- invPQ%m%invQinvP
Eval(dif, P=demomat(2,2), Q=demomat(2,2))
# 行列式
temp <- Det(P)
Expand(temp)
# log determinant
Det(P,log=1)
# 数値的検証
dd <- Det(R)
Rn <- matrix(runif(3*3),3)
Print( Eval(dd,R=Rn),det(Rn) )
# ラプラス展開
DetL(R)
dd2 <- DetL(R, maxlevel=2)
Print( Eval(dd2,R=Rn),det(Rn) )
# 行列の要素の和
t(one3) %T% A %T% one2
Sum(A)
# 行列の各列の和 (colSums に相当)
t(one3) %T% A
apply( A, 2, Sum)
# 行列の各行の和 (rowSums に相当)
A %T% one2
apply( A, 1, Sum)
# 中心化行列
J <- diag(3) %m% ("(1/3)"%t%one3%T%t(one3))
# 行列の中心化
J %T% A |> Expand()
apply( Eval( J%T%A, A=matrix(runif(3*2),3) ), 2, sum )
# ベクトルの要素の2乗和
t(v2) %T% v2
Sum( v2 %t% v2 )
# 行列の要素の2乗和
tr(t(A) %T% A)
tr(A %T% t(A))
Sum(A %t% A)
# 行列のベクトル化
vec(R)
# vec 関数と Kronecker 積による表現
# vec( X %T% Y %T% Z) == ( t(Z) %@% X ) %T% vec(Y)
X=demomat(2,2,root="x"); Y=demomat(2,2,root="y"); Z=demomat(2,2,root="z")
Xn=demomat(2,2); Yn=demomat(2,2); Zn=demomat(2,2)
vecXYZ <- vec(X%T%Y%T%Z)
vecXYZ <- Expand( vecXYZ )
tZKXvY <- (t(Z)%@%X) %T% vec(Y)
Print(vecXYZ,"\n",tZKXvY)
dif <- vecXYZ %m% tZKXvY
Eval(dif, X=Xn, Y=Yn, Z=Zn)
# トレースの vec 関数と Kronecker 積による表現:
# tr(XYZ) == t(vec(t(X)) I%@%Y vec(Z)
trXYZ <- tr( X%T%Y%T%Z )
vXetc <- t(vec(t(X))) %T% (diag(2)%@%Y) %T% vec(Z)
dif <- trXYZ %m% vXetc
Printm(trXYZ, vXetc,dif)
# 行列の下三角部分のベクトル化
( temp <- vech(R) )
vechinv(temp)
( temp <- vech(R,1) )
vechinv(temp,1)
# 行列の要素の総和記号による表現
# (大文字は行列、小文字は列ベクトルとして取り扱われる.)
mat2sum( "A %*% B" )
mat2sum( "A %*% B", root="z" )
mat2sum( "A %*% B", simple=0 )
mat2sum( "t(A) %*% B" )
mat2sum( "A %*% t(B)" )
mat2sum( "A %*%Diag(B)%*%C" )
mat2sum( "A %*% b" )
mat2sum( "t(a) %*% B" )
mat2sum( "a %*% t(b)" )
mat2sum( "A%*%(B+C)" )
mat2sum( "A%*%(B+C)", expand=0 )#'
mat2sum( "t(A)%*%t(B)%*%C - D%*%t(E)" )
mat2sum( "A%*%diag(B)%*%C - diag(D)%*%E%*%diag(F)%*%G + diag(H)" )
# 総和記号の展開他
exp <- "s( a[i]+b[i] - s( c[i,j]-d[i,j], {j} ), {i})"
sumExpand( exp, all=1 )
exp <- "s( a[i]+b[i] - s( c[i,j]-d[i,j], {j,1,nj} ), {i,1,ni})"
sumEval( exp, values="nj=2; ni=3")
sumMoveIn( "s( s( a[i,j]*b[j,k]*c[k,l], {k}) , {j})" )
exp="s( x + s( s( a[i,j]*b[j,k]*c[k,l], {k}) - y, {j}), {l})"
sumMoveIn( exp, all=1 )