r - 使用 Caracas 包的 R 中 SymPy 矩阵的平方根
问题描述
语言: R
; 使用的包装: caracas
假设我有一个复杂的符号矩阵 M,我想找到矩阵的平方根。那就是找到一个这样的M = A %*% A
。对于我的问题,M
定义如下:
library(caracas)
# Define M
s_b <- matrix_(c(1, 0, 0, 1), 2, 2)
X <- matrix_(c(2, 1, 1, 1), 2, 2)
o <- symbol('o')
M <- inv(1/o * t(X) %*% X + inv(s_b))
我尝试使用包中的eigenval
andeigenvec
函数caracas
来生成特征值和特征向量的列表,但由于它们是 SymPy 对象的复杂列表,因此无法弄清楚如何将这些列表转换为矩阵。
这篇文章中的解决方案没有帮助,因为 R 不是将矩阵的平方根作为一个整体,而是取条目的平方根。
解决方案
我已经想出了解决方案。在这个解决方案中,我使用对角化方法。
要将任何符号值分配给符号矩阵,必须先将其转换为字符。IE。必须使用该as.character
功能。
以下代码生成这样的示例符号P,D
矩阵,R
M
M=P %*% D %*% inv(P)
图书馆(加拉加斯)
a=符号('a')
m=matrix_( c("1", "a", "a", "1"), 2)
eigenVec_V_b <- eigenvec(m)
D <- 矩阵_(c(0, 0), n, n)
for(i in 1:n){ D[i, i] <- as.character(eigenVec_V_b[[i]]$eigval) }
P <- 矩阵_(c(0, 0), 1, n)
for(i in 1:n){ P[,i] <- as.character(eigenVec_V_b[[i]]$eigvec) }
要测试代码是否正确实现,只需运行P %*% D %*% inv(P)
并且它应该返回相同的矩阵M
要获得 M 的平方根,请运行P %*% sqrt(D) %*% inv(P)
. 这些条目并未完全简化(即使在应用该simplify
函数之后),因此它们不会与原始矩阵匹配,但一旦手动简化,这些值就会显示正确。
推荐阅读
- firebase - 包含数组的查询的 Firestore 安全规则
- powershell - Powershell 覆盖赋值和比较运算符
- swift - 正则表达式:捕获组和空字段(SWIFT 5 | ICU 正则表达式引擎)
- android - com.google.android.gms:play-services-base 在 React Native 中的编译和运行时冲突
- webpack - webpack 可以正确处理 require() 吗?
- java - 如何为任何类型的可比较对象实现 compareTo
- linux - 无法在上下文中使用 cuDNN 无:无法使用 cuDNN 编译:致命错误:cudnn.h:没有这样的文件或目录
- javascript - 退出抽屉内的子堆栈导航器时,如何使用 react-navigation 转到 initialRoute?
- c# - ViewBag 空了
- debugging - 带有单个美元符号的缩进