# /home/bill/Qnial/MY_NDFS/Examples/matrix operations - symbolic & real-valued, examples.ndf # www.BillHowell.ca 09Feb2013, 05Aug2015 add Kronecker product # this goes with "/home/bill/Qnial/MY_NDFS/matrix operations - symbolic & real-valued.ndf" f_matrixEx := 'matrix operations - symbolic & real-valued, examples.ndf' ; d_examples := '/home/bill/Qnial/MY_NDFS/Examples/' ; write link 'loading ' f_matrixEx ; lq_matrixEx IS loaddefs link d_examples f_matrixEx #********* # Examples identity_matrix1 := 'test_A := Identity_matrix 5' 'test_IA := identity_matrix_is test_A' ' ' ; IF flag_check THEN check_examples 'identity_matrix1' ; ENDIF ; basic_ops1 := 'C := 1 5 reshape 1 2 3 4 5' 'D := 5 1 reshape 20 21 22 23 24' ' ' 'C := 1 5 reshape array_of_strings 1 2 3 4 5' 'C2 := 5 1 reshape array_of_strings 20 21 22 23 24' 'Cp := string_array_plus C1' 'Ct := string_array_times C2' ' ' 'CD_sym := vector_dot_multiply_symbolic C1 C2' 'CD1_sym := matrix_multiply_symbolic C1 C2' 'CD_sym_num := EACH execute CD_sym' 'CD1_sym_num := EACH execute CD1_sym' 'CD := vector_dot_multiply C D' 'CD1 := matrix_multiply C D' ' ' 'CD_results := "C "D "CD_sym "CD1_sym "CD_sym_num "CD1_sym_num "CD "CD1 C D CD_sym CD1_sym CD_sym_num CD1_sym_num CD CD1' 'CD_results_rows := 2' 'CD_results_cols := floor ((gage shape CD_results) / CD_results_rows)' 'CD_results := transpose (CD_results_rows CD_results_cols reshape CD_results)' ; IF flag_check THEN check_examples 'basic_ops1' ; ENDIF ; basic_ops2 := 'A := 3 5 reshape tell 20' 'B := 5 4 reshape (+ 20 (tell 23))' 'As Bs := EACH array_of_strings A B' 'Al Bl := EACH array_numeric_to_indexLabelled ("A A) ("B B)' ' ' 'AB_sym := matrix_multiply_symbolic As Bs' 'AB_sym_num := EACH execute AB_sym' ' ' 'AB_lab := matrix_multiply_symbolic Al Bl' 'AB_lab_num := EACH execute AB_lab' ' ' 'AB := matrix_multiply A B' ' ' ; # just makes unreadable junk (link 'AB_results := "A "B "As "Bs "AB_sym "AB_lab "AB "AB_sym_num "AB_lab_num ' ' A B As Bs AB_sym AB_lab AB AB_sym_num AB_lab_num ' ) 'AB_results_rows := 2' 'AB_results_cols := floor ((gage shape AB_results) / AB_results_rows)' 'AB_results := transpose (AB_results_rows AB_results_cols reshape AB_results)' IF flag_check THEN check_examples 'basic_ops2' ; ENDIF ; # Examples - from Wikipedia http://en.wikipedia.org/wiki/Kronecker_product Kronecker_ex1 := 'A := 2 2 reshape 1 2 3 4' 'B := 2 2 reshape 0 5 6 7' (link 'A_lab := labelled_array ' apo 'A' apo ' (2 2)' ) (link 'B_lab := labelled_array ' apo 'B' apo ' (2 2)' ) (link 'C := labelled_array ' apo 'C' apo ' (2 5)' ) (link 'D := labelled_array ' apo 'D' apo ' (3 4)' ) ' ' 'KP1_num := Kronecker_prod A B ' 'KP1_sym := Kronecker_prod_symbolic A B ' 'KP1_symNum := EACH execute KP1_sym' ' ' (link 'KP1_reference := 4 4 reshape ' ' 0 5 0 10 ' ' 6 7 12 14 ' ' 0 15 0 20 ' ' 18 21 24 28 ' ) ' ' 'Compliance_KP1 := = KP1_num KP1_symNum KP1_reference' ; IF flag_check THEN check_examples 'Kronecker_ex1' ; ENDIF ; # ex2 is from ICICIP2015 141 p Wei, Liu - Consensus Tracking Control of Leader-Follower Multi-Agent Systems Based on the Networked Predictive Control Scheme.pdf Kronecker_ex2 := 'A := 2 2 reshape 1 2 3 4' 'B := 2 2 reshape 0 5 6 7' (link 'A_lab := labelled_array ' apo 'A' apo ' (2 2)' ) (link 'B_lab := labelled_array ' apo 'B' apo ' (2 2)' ) (link 'C := labelled_array ' apo 'C' apo ' (2 5)' ) (link 'D := labelled_array ' apo 'D' apo ' (3 4)' ) ' ' 'KP1_num := Kronecker_prod A B ' 'KP1_sym := Kronecker_prod_symbolic A B ' 'KP1_symNum := EACH execute KP1_sym' ' ' (link 'KP1_reference := 4 4 reshape ' ' 0 5 0 10 ' ' 6 7 12 14 ' ' 0 15 0 20 ' ' 18 21 24 28 ' ) ' ' 'Compliance_KP1 := = KP1_num KP1_symNum KP1_reference' ; # IF flag_check THEN check_examples 'Kronecker_ex1' ; ENDIF ; # Cheng's semi-tensor product # Examples - from Cheng, Chapter 2 (date?) : page 32 http://www.google.ca/url?sa=t&rct=j&q=semi-tensor%20product%20of%20matrices%20and%20its%20applications&source=web&cd=1&cad=rja&ved=0CDEQFjAA&url=http%3A%2F%2Fwww.intlpress.com%2FMAA%2Fp%2F2003%2F10_4%2FMAA-10-4-565-588.pdf&ei=mMsPUYKVIs3ryAHz5IGABA&usg=AFQjCNE2DeFnPiDXnLSnBsPStg-UAESSAg&bvm=bv.41867550,d.aWc #----- # Example 1 X1 := vector_from_list (2 -1 1 2) 'row' ; Y1 := vector_from_list (-2 1) 'col' ; # an intermediate is: Z1_reference = [2 −1] × (−2) + [1 2] = [-3 4] Z1 := Semi_tensor_prod X1 Y1 ; Z1_reference := 1 2 reshape -3 4 ; Compliance_Z1 := Z1 = Z1_reference ; #----- # Example 2 X2 := 3 4 reshape 2 1 -1 3 0 1 2 -1 2 -1 1 1 ; Y2 := 2 2 reshape -1 2 3 2 ; # an interediate is : Z2 = Semi_tensor_prod X2 Y2 = (the following is WRONG from his book?... see also Z2_reference below!) (21) × (−1) + (−13) × 3 (21) × 2 + (−13) × 2 (01) × (−1) + (2 − 1) × 3 (01) × 2 + (2 − 1) × 2 ⎦ (2 − 1) × (−1) + (11) × 3 (2 − 1) × 2 + (11) × 2 # Z2 := Semi_tensor_prod X2 Y2 ; # Z2_reference := 3 4 reshape -5 8 2 8 6 -4 4 0 1 4 6 0 ; # Compliance_Z2 := Z2 = Z2_reference ; # Examples from Cheng's Matlab toolbox - example01.m # This example is to show how to perform semi-tensor product # Code has been "morphed" for QNial, and my name for operators x3 := vector_from_list (1 2 3 -1) 'row' ; y3 := vector_from_list (2 1) 'col' ; r3 := semi_tensor_prod x3 y3 ; r3_reference := vector_from_list (5 3) 'row' ; Compliance_R3 := r3 = r3_reference ; # x4 := vector_from_list (2 1) 'row' ; y4 := vector_from_list (1 2 3 -1) 'col' ; r4 := sp(x,y) r4_reference := vector_from_list (5 3) 'row' ; Compliance_r4 := r4 = r4_reference ; # x5 := 3 4 reshape 1 2 1 1 2 3 1 2 3 2 1 0 ; y5 := 2 2 reshape 1 -2 2 -1 ; r5 := semi_tensor_prod x5 y5 ; %r5_1 := sp1(x,y) ; r5_reference := 3 4 reshape 3 4 -3 -5 4 7 -5 -8 5 2 -7 -4 ; %r5_1_reference := [3,4,-3,-5 4,7,-5,-8 5,2,-7,-4] ; Compliance_r5 := r5 = r5_reference ; # r5 := sp(sp(x,y),y) r6 := spn(x,y,y) r5_reference r6_reference EACHLEFT := [-3,-6,-3,-3;-6,-9,-3,-6;-9,-6,-3,0] # Cheng's swap for semi-tensor operations? # W1 := swap_matrix_make 2 3 ; W1_reference := 6 6 reshape 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 ; # Compliance_W1 := W1 = W1_reference ; #***************************************** #***************************************** #-------------------------------- # Check on standard results # Compliances := 'KP_1_symbols := Kronecker_prod A B *' 'No equivalent' 'KP_1 := EACH execute KP_1_symbols' Compliance_KP_1 'Z1 := Semi_tensor_prod X1 Y1' Compliance_Z1 'Z2 := Semi_tensor_prod X2 Y2' Compliance_Z2 'r3 := Semi_tensor_prod X3 Y3' Compliance_r3 'r4 := Semi_tensor_prod X4 Y4' 'Compliance_r4 - not yet' 'r5 := Semi_tensor_prod X5 Y5' Compliance_r5 'W1 := swap_matrix_make 2 3' Compliance_W1 ; # comp_rows := floor (gage shape compliances / 2 ) ; Compliances := comp_rows 2 reshape Compliances ; #******************************* # 03Nov2015 For formulae and more general mms, see : #/home/bill/Documents_Toshiba/NN reviews/NEUNET-D-15-00496 m Luo, Wang, We - State Estimation for a Class of ANNs with Stochastically Corrupted Measurements under Round-Robin Protocol.ndf # enddoc