2016-10-02 2 views
2

rSymPy와 Ryacas를 모두 사용하여 R에서 기호 행렬을 적절히 사용하지 못하고 있습니다. Matlab에서 이것은 쉽습니다. R에서 이것을 수행하고 Matlab과 비슷한 출력을 얻는 방법에 대한 제안을 찾고 있습니다. Matlab에서이를 수행하려면 '기호 도구 상자'가 필요합니다.Matlab에서와 같이 R에서 기호 행렬 처리하기

이 예에서는 심볼 전이 확률 행렬 "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 
    } 
} 

그때 나는이를 mulitply 할 행렬.

(2) matlab에 - 곱하기 기호 매트릭스 -> 확인

P*P 

작품 잘.

(2) R - 곱셈 기호 매트릭스 ->

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

문제가되지 않는다. 다른 많은 시도들도 효과가 없었습니다. 이 작업을 올바르게 수행하는 방법에 대한 제안이 필요합니다. 예를 들어 (2) Matlab에서와 같은 출력을 얻으십시오.

추가 작업 :

(3) matlab에 - 각 요소를 개별적으로 SYM() -> OK 또한

내가 (방법 Sym을에 제안을 요청 것) 행렬 P의 하나의 요소 Matlab에서와 마찬가지로 R에서.

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! 

들으!

+1

이 작동합니다'라이브러리 (Ryacas); yacas ("P : = {{p11, p12}, {p21, p22}}"); yacas ("PrettyForm (P * P)")' –

+0

sympy doc [여기] (http://docs.sympy.org/0.7.2/modules/matrices/expressions.html)에서 시작하여 'rSymPy'에 포장하십시오 ... –

답변

1

내가 최근에했을 때 R 행렬을 파이썬에 필요한 형식으로 변환하는 함수를 작성했습니다 (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의 출력은 P[1,1]에 저장하는 "P11" 문자열입니다. 이때

, 우리 P 의해 주어지는 R 행렬 P 정의 : 우리 P의 각 요소에 대한 SymPy 변수를 작성한

 [,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" 

을하지만 상징적 매트릭스를 정의하지 않은 아직. 이것이 우리의 다음 단계입니다.

우리는 파이썬의 형식으로 R 행렬을 변환하는 함수를 정의 :

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] 

(난 그냥 사용하고 있습니다 : 기호 행렬 P을 정의하기 위해 다음과 같이

# 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) 
} 

당신은 위의 기능을 사용 cat(..., "\n") R에 매트릭스를 멋지게 인쇄하십시오.)

마지막으로, 다음과 같이 P*P을 계산 :

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

답장을 보내 주셔서 감사합니다. 원칙적으로 출력물을보고 싶습니다. 하지만 나중에 실제로 출력을 저장하고 사용해야합니다. 예를 들어, P [1,1] 등으로 최종 표현식에서 계산 된 각 요소에 액세스하려고합니다. 솔루션에서 어려울 것 같습니다. –

+0

이후에 요소에 접근해야한다면'cat (sympy ("B = P * P"), "\ n")'대신'B' 행렬을 정의하고'sympy "B [0,0]")'. @ J_F의 답변은 훨씬 간단 해 보입니다. – jav

2

을 그리고 이것은 rSymPy와 함께 작동 :

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]" 
+0

감사합니다. 전에이 예제를 보았습니다. 그러나 나에게 어려움은 실제로 모든 변수를 sym() 또는 var()로 분리하는 것입니다. 1000 개의 변수에 대해이 작업을 수행한다고 가정합니다. 즉, a1 <- Var ("a1") ..... a1000 <-Var ("a1000")입니다. 너 미쳤어. 루프에서 그렇게하는 방법을 찾는 것이 솔루션의 핵심입니다. –

+0

그래서 ... 아무 문제 없어. –

관련 문제