我无法使用rSymPy和Ryacas在R中适当地使用符号矩阵。在Matlab中这很容易。 我正在寻找如何在R中执行此操作并获得与Matlab 类似的输出的建议。要在Matlab中执行此操作,我需要使用符号工具箱'。
在这个例子中,我希望生成符号转换概率矩阵" P",即5 x 5,并且具有元素P11,P12,...,P55。然后我想使用这个矩阵进行乘法(使用自身和其他矩阵),并可能执行其他操作。
(1)Matlab - 生成符号矩阵 - >确定
P = sym('P%d%d', [5 5])
(1)R - 获取符号矩阵 - >确定
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 - 乘法符号矩阵 - &gt;确定
P*P
工作正常。
(2)R - 乘法符号矩阵 - &gt;问题
sympy("P * P")
Need Help Here!
不起作用。许多其他尝试也无效。我需要有关如何正确执行此操作并获得相同输出的建议,例如,在(2)Matlab中。
附加任务:
(3)Matlab - sym()每个元素分开 - &gt;确定
此外,我会询问如何将Sym()作为Matlab中R中矩阵P的单个元素的建议。
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()每个元素分开 - &gt;问题
Need Help Here!
所有建议的Thx!
答案 0 :(得分:2)
当我最近这样做时,我最终编写了一个函数来将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变量P11
。 Var
的输出是我们存储在"P11"
中的字符串P[1,1]
。
目前,我们已经定义了一个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"
我们为SymPy
的每个元素创建了一个P
变量,但我们还没有定义符号矩阵。这是我们的下一步。
我们定义了将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")
答案 1 :(得分:2)
这适用于library(rSymPy)
a1 <- Var("a1")
a2 <- Var("a2")
a3 <- Var("a3")
a4 <- Var("a4")
A <- Matrix(List(a1, a2), List(a3, a4))
A*A
#[1] "[a2*a3 + a1**2, a1*a2 + a2*a4]\n[a1*a3 + a3*a4, a2*a3 + a4**2]"
:
{{1}}