2012-08-10 5 views
1

나는 8 개의 죄와 코사인을 가지고 있으며, 아래에 나와있는 것처럼 Matlab을 사용하여 상징적으로 정의하려고합니다. 내 목표는이 모든 죄와 코사인을 사용하여 8x8의 행렬 H (누적 Givens 회전 행렬)를 상징적으로 구축하고이 H 직교 투영 행렬의 공식이 무엇인지 보는 것입니다. 나는 개념적으로 아래의 코드를 사용하여이를 수행 할 수있다. G7*G6*...*G0*I 여기서 Identity 8x8이고 Gi는 요소 (i : i + 1, i : i + 1)에 해당하는 기븐스 회전이다.상징적 인 직교 행렬을 프로토 타입하는 가장 쉬운 방법

c_0 = sym('c_0'); 
c_1 = sym('c_1'); 
c_2 = sym('c_2'); 
c_3 = sym('c_3'); 
c_4 = sym('c_4'); 
c_5 = sym('c_5'); 
c_6 = sym('c_6'); 
c_7 = sym('c_7'); 

s_0 = sym('s_0'); 
s_1 = sym('s_1'); 
s_2 = sym('s_2'); 
s_3 = sym('s_3'); 
s_4 = sym('s_4'); 
s_5 = sym('s_5'); 
s_6 = sym('s_6'); 
s_7 = sym('s_7'); 

% create H orthogonal matrix using the sin and cos symbols 
% filling in the first rotation 
I=eye(9,9) 
H = I; 
H(1:2,1:2) = [c_0 -s_0; s_0 c_0] 

% build the 2nd rotation and update H 
G = I; 
G(2:3,2:3) = [c_1 -s_1; s_1 c_1] 
H = G*H 

% build the 3rd rotation and update H 
G = I; 
G(3:4,3:4) = [c_2 -s_2; s_2 c_2] 
H = G*H 

% build the 4rth rotation and update H 
G = I; 
G(4:5,4:5) = [c_3 -s_3; s_3 c_3] 
H = G*H 

% build the 5th rotation and update H 
G = I; 
G(5:6,5:6) = [c_4 -s_4; s_4 c_4] 
H = G*H 

% build the 6th rotation and update H 
G = I; 
G(6:7,6:7) = [c_5 -s_5; s_5 c_5] 
H = G*H 

% build the 7th rotation and update H 
G = I; 
G(7:8,7:8) = [c_6 -s_6; s_6 c_6] 
H = G*H 

% build the 8th rotation and update H 
G = I; 
G(8:9,8:9) = [c_7 -s_7; s_7 c_7] 
H = G*H 

코드는 다음과 같은 오류와 함께 실패하고이 문제를 해결하는 방법을 찾을 수 없습니다 :

The following error occurred converting from sym to double: 
Error using mupadmex 
Error in MuPAD command: DOUBLE cannot convert the input expression into a double array. 
If the input expression contains a symbolic variable, use the VPA function instead. 

Error in build_rotH_test (line 26) 
H(1:2,1:2) = [c_0 -s_0; s_0 c_0] 
+1

내 inital 생각이 당신이 *의 H의 * 더블 때문에, *의 H = SYM (I) 일을 시도 오류가 있다는 것입니다 * 그렇게하지를 그것이 모든 것을 작동하게하는지 알지만 오류를 제거해야합니다. – Ghaul

+0

감사합니다. 나는 이미 그것을 알아 냈다. 내가 허락하자 마자 나는 해결책을 게시 할 것이다. 문제는 Matlab이 기호 변수를 실제 값 (눈으로 생성 된 값)과 결합 할 수 없도록하므로 0과 1도 변수로 작성한 다음 잘 동작합니다. –

답변

1

내가 이런 식으로 해결. 각 회전의 전치가 필요하다는 것을 깨달았으므로 H '* x 즉 G7'*G6'*...*G0'*I을 작성하고 적용 할 수 있습니다. 그 이유는 죄 기호가 솔루션에서 뒤집 혔기 때문입니다.

clear all; 

% defining 0 and 1 as symbols too, solves the problem 
sym_0 = sym('0'); 
sym_1 = sym('1'); 

c0 = sym('c0'); 
c1 = sym('c1'); 
c2 = sym('c2'); 
c3 = sym('c3'); 
c4 = sym('c4'); 
c5 = sym('c5'); 
c6 = sym('c6'); 
c7 = sym('c7'); 

s0 = sym('s0'); 
s1 = sym('s1'); 
s2 = sym('s2'); 
s3 = sym('s3'); 
s4 = sym('s4'); 
s5 = sym('s5'); 
s6 = sym('s6'); 
s7 = sym('s7'); 

% create H orthogonal matrix using the sin and cos symbols 
% filling in the first rotation 
I = repmat(sym_0,9,9); 
for i=1:9 
    I(i,i)=sym_1; 
end 
H = I 
H(1:2,1:2) = [c0 s0; -s0 c0] 

% build the 2nd rotation and update H 
G = I; 
G(2:3,2:3) = [c1 s1; -s1 c1] 
H = G*H; 

% build the 3rd rotation and update H 
G = I; 
G(3:4,3:4) = [c2 s2; -s2 c2] 
H = G*H; 

% build the 4rth rotation and update H 
G = I; 
G(4:5,4:5) = [c3 s3; -s3 c3] 
H = G*H; 

% build the 5th rotation and update H 
G = I; 
G(5:6,5:6) = [c4 s4; -s4 c4] 
H = G*H; 

% build the 6th rotation and update H 
G = I; 
G(6:7,6:7) = [c5 s5; -s5 c5] 
H = G*H; 

% build the 7th rotation and update H 
G = I; 
G(7:8,7:8) = [c6 s6; -s6 c6] 
H = G*H; 

% build the 8th rotation and update H 
G = I; 
G(8:9,8:9) = [c7 s7; -s7 c7] 
H = G*H 

출력은 다음과 같습니다

H = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


H = 

[ c0, s0, 0, 0, 0, 0, 0, 0, 0] 
[ -s0, c0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, c1, s1, 0, 0, 0, 0, 0, 0] 
[ 0, -s1, c1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, c2, s2, 0, 0, 0, 0, 0] 
[ 0, 0, -s2, c2, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, c3, s3, 0, 0, 0, 0] 
[ 0, 0, 0, -s3, c3, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, c4, s4, 0, 0, 0] 
[ 0, 0, 0, 0, -s4, c4, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, c5, s5, 0, 0] 
[ 0, 0, 0, 0, 0, -s5, c5, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 1, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, c6, s6, 0] 
[ 0, 0, 0, 0, 0, 0, -s6, c6, 0] 
[ 0, 0, 0, 0, 0, 0, 0, 0, 1] 


G = 

[ 1, 0, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 1, 0, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 1, 0, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 1, 0, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 1, 0, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 1, 0, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 1, 0, 0] 
[ 0, 0, 0, 0, 0, 0, 0, c7, s7] 
[ 0, 0, 0, 0, 0, 0, 0, -s7, c7] 


H = 

[      c0,      s0,      0,     0,    0,   0,   0,  0, 0] 
[     -c1*s0,     c0*c1,     s1,     0,    0,   0,   0,  0, 0] 
[     c2*s0*s1,    -c0*c2*s1,     c1*c2,     s2,    0,   0,   0,  0, 0] 
[    -c3*s0*s1*s2,    c0*c3*s1*s2,    -c1*c3*s2,    c2*c3,    s3,   0,   0,  0, 0] 
[   c4*s0*s1*s2*s3,   -c0*c4*s1*s2*s3,   c1*c4*s2*s3,   -c2*c4*s3,   c3*c4,   s4,   0,  0, 0] 
[  -c5*s0*s1*s2*s3*s4,  c0*c5*s1*s2*s3*s4,  -c1*c5*s2*s3*s4,  c2*c5*s3*s4,  -c3*c5*s4,  c4*c5,  s5,  0, 0] 
[  c6*s0*s1*s2*s3*s4*s5, -c0*c6*s1*s2*s3*s4*s5,  c1*c6*s2*s3*s4*s5, -c2*c6*s3*s4*s5,  c3*c6*s4*s5, -c4*c6*s5,  c5*c6,  s6, 0] 
[ -c7*s0*s1*s2*s3*s4*s5*s6, c0*c7*s1*s2*s3*s4*s5*s6, -c1*c7*s2*s3*s4*s5*s6, c2*c7*s3*s4*s5*s6, -c3*c7*s4*s5*s6, c4*c7*s5*s6, -c5*c7*s6, c6*c7, s7] 
[ s0*s1*s2*s3*s4*s5*s6*s7, -c0*s1*s2*s3*s4*s5*s6*s7, c1*s2*s3*s4*s5*s6*s7, -c2*s3*s4*s5*s6*s7, c3*s4*s5*s6*s7, -c4*s5*s6*s7, c5*s6*s7, -c6*s7, c7] 
관련 문제