"Di piu'" sulle matrici e gli array
Questa sezione illustrera' maggiori informazioni riguardo la manipolazione delle matrici e degli array, specificatamente su:![]() |
Algebra lineare |
![]() |
Array |
![]() |
Dati "Multivariate" |
![]() |
Indicizzazione nelle matrici e liste |
Algebra lineare
Informalmente, il termine matrice e array sono solitamente interscambiabili. Piu' precisamente, una matrice numerica bi-dimensionale e' un array che rappresenta una trasformazione lineare. Le operazioni matematiche definite sulle matrici sono il soggetto dell' algebra lineare.
Abbiamo discusso riguardo le basi delle matrici stesse. Prenderemo lo stesso esempio anche per questa stessa sezione. Usiamo ora la matrice quadrata magica,
S = [16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
Sommando la trasposta ad una matrice, ne risultera' una matrice simmetrica,
S+S'
produce,
ans =
! 32. 8. 11. 17.
!
! 8. 20. 17. 23.
!
! 11. 17. 14. 26. !
! 17. 23. 26. 2.
!
Il simbolo di moltiplicazione, *, denota che la moltiplicazione della matrice coinvolge il prodotto interno tra righe e colonne. Anche moltiplicando una matrice per la sua trasposta otterremo sempre una matrice simmetrica.
S'*S
questo produce,
ans =
! 378. 212. 206. 360. !
! 212. 370. 368. 206. !
! 206. 368. 370. 212. !
! 360. 206. 212. 378. !
Il determinante di questa particolare matrice appare come zero, indicando che la matrice e' singolare.
det(S)
ans =
0.
Siccome la matrice e' singola, non ha un inverso. Se provi a calcolare l'iverso con,
inv(S)
Questo produce un messaggio di avvertimento,
warning
matrix is close to singular or badly scaled.
results may be inaccurate. rcond = 1.1755E-17
ans =
1.0E+14 *
! 1.2509999 3.7529997 - 3.7529997 - 1.2509999 !
! - 3.7529997 - 11.258999 11.258999 3.7529997 !
! 3.7529997 11.258999 - 11.258999 - 3.7529997 !
! - 1.2509999 - 3.7529997 3.7529997 1.2509999 !
Array
Quando sono allontanati dal mondo dell'algebra lineare, le matrici diventano un array numerico bi-dimensionale. Le operazioni aritmetiche sugli aray sono fatte elemento per elemento. Questo significa che addizione e sottrazione sono gli stessi per matrici ed array ma le operazioni di moltiplicazione sono differenti. SCILAB usa un punto, o punto decimale, come parte della notazione per le operazioni di moltiplicazione sugli array.
Le operazioni sugli array sono comode per produrre tavole. Supponi che n sia il vettore colonna,
s = [1:6]';
Usando il vettore colonna noi possiamo generare una tavola di algoritmi,
[s ; log10(s)]
Questo produce,
ans =
! 1.
0. !
! 2.
.30103 !
! 3.
.4771213 !
! 4.
.6020600 !
! 5.
.69897 !
! 6.
.7781513 !
Dati "Multivariate"
SCILAB usa una analisi orientata alla colonna per i dati statistici "multivariate". Ciascuna colonna in un set di dati rappresenta una variabile e ogni righa un osservazione. L'elemento (i,j)-esimo corrisponde alla i-esima osservazione della variabile j-esima.
Per esempio, consideramndo un data set con due variabili,
m_val =
! 100. 82. !
! 120. 88. !
! 124. 92. !
! 97. 76. !
! 110. 80. !
I dati contengono la pressione sanguigna di pazienti in diversi istanti di tempo. Usando SCILAB possiamo fare svariate analisi con questo set di dati.
Per esempio, se ci serve la media e la deviazione
avg = mean(m_val),dev = st_deviation(m_val)
questo produce,
avg =
! 110.2 !
! 83.6 !
dev =
! 11.882761 !
! 6.3874878 !
Espansione scalare
Matrici e scalari possono essere combinati in diverse maniere. Per esempio, uno scalare viene sottratto da una matrice, sottraendolo da ciascun elemento.Per esempio,
s = ones(4,4); s-1
Questo produce,
ans =
! 0. 0. 0. 0. !
! 0. 0. 0. 0. !
! 0. 0. 0. 0. !
! 0. 0. 0. 0. !
Con una espansione, SCILAB assegna uno scalare specifico a tutti gli indici in una gamma.
Per esempio,
s(1:2,2:3)=0
s =
! 1. 0. 0. 1. !
! 1. 0. 0. 1. !
! 1. 1. 1. 1. !
! 1. 1. 1. 1. !
Operazioni matriciali
La seguente tabella esplica la sintassi della operazioni matriciali base disponibili in SCILAB
[] | definizione di matrice, concatenazione |
; | separatore di righa |
() | estrazione m=a(k) |
() | inserzione: a(k)=m |
’ | trasposizione |
+ | addizione |
- | sotrazione |
* | moltiplicazione |
\ | divisione a sinistra |
/ | divisione a destra |
^ | esponente |
.* | moltiplicazione "elementwise" |
.\ | divisione a sinistra "elementwise" |
./ | divisione a destra "elementwise" |
.^ | esponente "elementwise" |
.*. | prodotto di kronecker |
./. | divisione a destra kronecker |
.\. | divisione a sinistra kronecker |
La funzione trova (find)
La funzione find determina gli indici degli elementi dell'array che corrispondono ad una condizione logica data. Nella sua piu' semplice forma , find ritorna un vettore colonna di indici. Trasponendo questo vettore ottieni un vedttore righa di indici.Per esempio,
Proviamo a usare la funzione find per generare una sequenza a caso di elementi 1 o -1.
r_seq = rand(1,5,'normal');
r_seq(find(r_seq>=0)) =1;
r_seq(find(r_seq<0)) =-1
r_seq =
! - 1. - 1. - 1. 1. - 1. !