gpt4 book ai didi

r - 像在 Matlab 中一样在 R 中处理符号矩阵

转载 作者:太空宇宙 更新时间:2023-11-03 20:23:42 26 4
gpt4 key购买 nike

我无法通过 rSymPy 和 Ryacas 适本地使用 R 中的符号矩阵。在 Matlab 中这很容易。 我正在寻找如何在 R 中执行此操作并获得与在 Matlab 中类似的输出的建议。要在 Matlab 中执行此操作,我需要“符号工具箱”。

在这个例子中,我希望生成一个符号转移概率矩阵“P”,即 5 x 5,具有元素 P11、P12、...、P55。然后,我想使用此矩阵进行乘法(与自身和其他矩阵相乘)并可能还执行其他操作。

(1) Matlab - 生成符号矩阵 -> OK

P = sym('P%d%d', [5 5])

(1) R - 获取符号矩阵 -> OK

library(rSymPy)
P<-matrix(nrow=5, ncol=5)
for (i in 1:5){
for (j in 1:5) {
P[i,j]<-paste0(Sym("P"), i, j) # tried Var("P") also
}
}

然后我想乘这些矩阵。

(2) Matlab - 乘以符号矩阵 -> OK

P*P 

工作得很好。

(2) R - 乘以符号矩阵 -> 问题

sympy("P * P")
Need Help Here!

不起作用。许多其他尝试也没有奏效。我需要有关如何正确执行此操作并获得与例如 (2) Matlab 中相同的输出的建议。

附加任务:

(3) Matlab - sym() 每个元素分别-> OK

此外,我会征求如何像在 Matlab 中一样对 R 中矩阵 P 的单个元素进行 Sym() 的建议。

for i = 1:5;
for j = 1:5;
P = sprintf('P%d%d',i,j);
assignin('caller',P,sym(P));
end;
end;

(3) R - Sym() 每个元素分开 -> 问题

Need Help Here!

感谢所有建议!

最佳答案

当我最近这样做时,我最终编写了一个函数来将 R 矩阵转换为 Python 所需的格式(参见 https://cran.r-project.org/web/packages/rSymPy/rSymPy.pdf 第 3 页示例中给出的 2x2 矩阵)。

让我们首先从在 R 中定义矩阵 P 开始:

library(rSymPy)

P<-matrix(nrow=5, ncol=5)
for (i in 1:5){
for (j in 1:5) {
P[i,j] = Var(paste0("P", i, j)) # Declare variable in matrix first
}
}

我刚刚获取了您的代码并稍作调整。具体来说,对于矩阵 P 的每个元素,通过执行 Var(paste0("P", i, j)) 为此元素创建一个 SymPy 变量。例如,当 i = j = 1 时,我们将创建 Sympy 变量 P11Var 的输出是我们存储在 P[1,1] 中的字符串 "P11"

此时,我们已经定义了一个R矩阵P,其中P由下式给出:

     [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] "P11" "P12" "P13" "P14" "P15"
[2,] "P21" "P22" "P23" "P24" "P25"
[3,] "P31" "P32" "P33" "P34" "P35"
[4,] "P41" "P42" "P43" "P44" "P45"
[5,] "P51" "P52" "P53" "P54" "P55"

我们已经为 P 的每个元素创建了一个 SymPy 变量,但是我们还没有定义符号矩阵。这是我们的下一步。

我们定义将 R 矩阵转换为 Python 格式的函数:

# Converts matrix in R to Python's format
mat2py <- function(x){
str = lapply(1:nrow(x), function(i) paste0(x[i,], collapse = ", "))
str = paste0("Matrix([", paste0("[", unlist(str), "]", collapse = ", "), "])")
return (str)
}

您使用上面的函数如下定义符号矩阵P:

cat(sympy(paste0("P = ", mat2py(P))), "\n")

# [P11, P12, P13, P14, P15]
# [P21, P22, P23, P24, P25]
# [P31, P32, P33, P34, P35]
# [P41, P42, P43, P44, P45]
# [P51, P52, P53, P54, P55]

(我只是使用 cat(..., "\n") 在 R 中很好地打印矩阵)。

最后,计算P*P如下:

cat(sympy("P*P"), "\n")

关于r - 像在 Matlab 中一样在 R 中处理符号矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39820161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com