在Matlab中处理R中的符号矩阵

时间:2016-10-02 18:18:56

标签: r matlab matrix-multiplication symbolic-math

我无法使用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!

2 个答案:

答案 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变量P11Var的输出是我们存储在"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}}