SymbolicOps_JPH {lazy.symbolic} | R Documentation |
拡張された数値演算子の例
Description
拡張された数値演算子の例
全ての例を動かすと長い時間が掛かる可能性あり。
Details
English help file: SymbolicOps
Examples
# 数値的演算子の拡張
modify_math_operators()
# 行列とベクトルの定義
set.seed(1701+1701)
Pn=matrix(round(100*runif(4)),2,2)
Qn=matrix(round(100*runif(4)),2,2)
Rn=matrix(round(100*runif(9)),3,3)
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
# R のベクトル
vec2=c("c1","c2")
vec3=c("c1","c2", "c3")
# 転置
t(A)
# トレース
tr(P)
# 対角要素
Diag(P)
diag(P)
# 2項演算子
# 数値的行列
(vn <- 1+2-(1:2)*(2:3))
vn + Pn%*%Qn
# 行列とスカラー
1 + A
2 - v2
3 * A
B %*% 4
# ベクトル同士の加減算
v2 + v2
v2 - v2
#行列同士の加減算
A + B
A - B
# 行列 x ベクトル
A %*% v2
t(v3) %*% A
# 行列 x ベクトル
A %*% one2
t(one3) %*% A
# 行列 x 行列
P %*% Q
Q %*% P
#行列 x 行列
A %*% C
C %*% A
# 列の定数倍
A %*% Diag(P)
# 行の定数倍
Diag(R) %*% A
# 列の入れ替え
A %*% pmat(2,1,2)
# 行の入れ替え
pmat(3,1,2) %*% A
# 直交行列
temp <- " cos(theta) -sin(theta)
sin(theta) cos(theta)"
T <- cards(temp)
T <- matrix(unlist(T),2,2)
tTT <- t(T%*%T)
Eval(tTT,theta=0)
Eval(tTT,theta=0, check=0)
# 3次元空間での平面回転法
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)
# rotation in 3D
T <- Tx%*%Ty%*%Tz
T <- Simplify(T)
Tn <- Eval(T, values="theta1=1; theta2=2; theta3=3", check=0)
# see if T is orthonormal
t(Tn) %*% Tn |> round(.3)
Tn%*%t(Tn) |> round(.3)
# 演算子の優先順位 (数値演算と同じ)
P + t(Q)%*%Q
# \%p\%, \%m\%, \%T\%, \%t\% こちらは優先順位が変わるので注意。
P %p% t(Q)%*%Q
# 行列の積の転置: t(PQ) == t(Q) t(P)
tPQ <- t( P%*%Q )
tQtP <- t(Q)%*%t(P)
Eval( tPQ-tQtP, P=Pn, Q=Qn)
# アダマール積
A * B
v2 * v2
# クロネッカー積
A %@% B
one2 %@% P
diag(3) %@% P
b_diag( P,P,P)
# R のベクトルの積
vec3 * A
A * vec3
vec2 * A
# 逆行列: 2 x 2
Pinv=Inv(P)
PinvP=Pinv %*% P
# 数値的検証
Eval(PinvP, P=Pn)
# 逆行列: 3 x 3
Rinv=Inv(R)
RRinv=R %*% Rinv
# 数値的検証
Eval( RRinv, R=Rn ) # 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)
invLT <- Expand(invLT)
LTinvLT <- LT%*%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-tinvP, P=Pn, Q=Qn)
# 行列の積の逆行列: Inv(PQ) == Inv(Q) Inv(P)
invPQ <- Inv(P%*%Q)
invQinvP <- Inv(Q)%*%Inv(P)
dif <- invPQ-invQinvP
# 数値的検証
Eval(dif, P=Pn, Q=Qn)
# ブロック対角行列とその逆行列
A2 <- demomat(2,2,root="a")
B2 <- demomat(2,2,root="b")
( bigAB2 <- b_diag(A2,B2) )
( invbigAB2 <- Inv(bigAB2) )
( invBigAB2 <- b_diag(Inv(A2),Inv(B2)) )
invBigAB2-invbigAB2
# Eval(invbigAB2-invBigAB2, A2=demomat(2,2),B=demomat(2,2))
# 行列式
( temp <- Det(P) )
temp |> Expand(simplify=0) |> Simplify()
# 行列式の対数
Det(P,log=1)
# 数値的検証
( dd <- Det(R) )
Rn <- matrix(runif(3*3),3)
Print( Eval(dd,R=Rn),det(Rn) )
( ddd <- Expand(dd) |> Expand() |> Simplify() )
Print( Eval(ddd,R=Rn),det(Rn) )
# 行列の要素の和
t(one3) %*% A %*% one2
Sum(A)
# 列の和
t(one3) %*% A
apply( A, 2, Sum)
# 行の和
A %*% one2
apply( A, 1, Sum)
# 中心化行列
J <- diag(3) - ("(1/3)"%*%one3%*%t(one3))
# 行列の中心化
( temp <- J %*% A )
Expand(temp)
# 数値的検証
apply( Eval( J%*%A, A=matrix(runif(3*2),3) ), 2, sum )
# 行列の要素の2乗和
t(v2) %*% v2
Sum( v2 * v2 )
# 行列の要素の2乗和
tr(t(A) %*% A)
tr(A %*% t(A))
Sum(A * A)
# 行列の引き延ばし(ベクトル化)
vec(R)
# vec 演算子とクロネッカー積
# vec( X %*% Y %*% Z) == ( t(Z) %@% X ) %*% 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%*%Y%*%Z)
vecXYZ <- Expand( vecXYZ )
tZKXvY <- (t(Z)%@%X) %*% vec(Y)
Print(vecXYZ,"\n",tZKXvY)
dif <- vecXYZ - tZKXvY
# 数値的検証
Eval(dif, X=Xn, Y=Yn, Z=Zn)
# トレース、vec 演算子とクロネッカー積: tr(XYZ) == t(vec(t(X)) I%@%Y vec(Z)
trXYZ <- tr( X%*%Y%*%Z )
trXYZ <- Expand(trXYZ)
vXetc <- t(vec(t(X))) %*% (diag(2)%@%Y) %*% vec(Z)
vXetc <- Expand(vXetc)
(dif <- trXYZ - vXetc)
# 行列の下半分のベクトル化
( temp <- vech(R) )
vechinv(temp)
( temp <- vech(R,1) )
vechinv(temp,1)
# 分割行列(ブロック行列)
# 完全記号行列(要素は行列名のみ)
# 2 x 2 の分割行列
Ap=demomat(2,2,root="A" ,fullsymb=1)
Bp=demomat(2,2,root="B" ,fullsymb=1)
Print(Ap,Bp)
# 記号行列(記号行列を要素として持つ行列)
A11=demomat(2,2,root="a11_"); A12=demomat(2,3,root="a12_")
A21=demomat(3,2,root="a21_"); A22=demomat(3,3,root="a22_")
B11=demomat(2,2,root="b11_"); B12=demomat(2,3,root="b12_")
B21=demomat(3,2,root="b21_"); B22=demomat(3,3,root="b22_")
bigA=rbind( cbind(A11,A12), cbind(A21,A22) )
# attributes(bigA)$SMdim=list(nrows=c(2,3), ncols=c(2,3))
bigB=rbind( cbind(B11,B12), cbind(B21,B22) )
# attributes(bigB)$SMdim=list(nrows=c(2,3), ncols=c(2,3))
Printb(bigA, sep=" ")
# 記号行列による検証
bigAp=matReplace( Ap, A11=A11, A12=A12, A21=A21, A22=A22)
Print(bigA,bigAp)
# 分割行列の転置行列
( tAp=t(Ap) )
# 記号行列による検証
bigtAp=matReplace( tAp, A11=A11, A12=A12, A21=A21, A22=A22)
Print(t(bigA),bigtAp)
# 分割行列の加減演算
Ap+Bp
Ap-Bp
# 記号行列による検証
vlist="A11=A11; A12=A12; A21=A21; A22=A22; B11=B11; B12=B12; B21=B21; B22=B22"
matReplace(Ap+Bp, values=vlist)
bigA+bigB
# 分割行列の掛け算
Ap %*% Bp
# 記号行列による検証
matReplace(Ap%*%Bp, values=vlist) - bigA%*%bigB
# 分割行列の対角化
Diag(Ap)
Diag( map("Diag", diag(Ap)) )
# ブロック対角行列
( bigL <- demomat(3,3,root="A", shape="lowert", fullsymb=1) )
# ブロック対角行列の逆行列
( invbigL <- matSweep(bigL) )
# 完全記号行列による検証
Expand(Simplify( bigL%*%invbigL, all=1 ), all=1 )
Expand(Simplify( invbigL%*%bigL, all=1 ), all=1 )
# invserse by matSweep (Inv)
( invAp1=Inv(Ap) )
( invAp2=Inv(Ap, 2:1) )
# 完全記号行列による検証
( iAA <- Simplify(Expand(invAp1 %*% Ap, all=1),all=1) )
( AiA <- Simplify(Expand(Ap %*% invAp1, all=1),all=1) )
# inv(Ap1)%+%Ap の 12 要素
iAA12 <- iAA[1,2]
analyze_expr( iAA12 )
# Let A22.1=A22-A21%*%inv(A11)%*%A12 and simplify visually.
iAA12s <- gsub("A22-A21%*%inv(A11)%*%A12","A22.1", iAA12, fixed=1 )
analyze_expr( iAA12s )
# inv(Ap1)%+%Ap の 22 要素
iAA22 <- iAA[2,2]
analyze_expr( iAA22 )
# Let A22.1=A22-A21%*%inv(A11)%*%A12 and simplify visually.
iAA22s <- gsub("A22-A21%*%inv(A11)%*%A12","A22.1", iAA22, fixed=1 )
analyze_expr( iAA22s )
[Package lazy.symbolic version 1.0.0.20250316 ]