mihaispr
Administrator
Inregistrat: acum 17 ani
Postari: 2142
|
|
Input: 2 2 3 4 4 5 6 7 7 7 7 7 8 8 8 9 9 10 10 10 10
Output dorit:
[7 7 7] [8 8 8] [10 10 10]
ix=[2 2 3 4 4 5 6 7 7 7 7 7 8 8 8 9 9 10 10 10 10]; nx= (1:max(ix)).'; ac=accumarray(ix.',1); r=repmat(nx(ac>=3),1,3)
Functia accumarray tutorial
Input: 2 2 3 4 4 5 6 7 7 7 7 7 8 8 8 9 9 10 10 10 10
Output dorit:
[7 7 7] [8 8 8] [10 10 10]
ix=[2 2 3 4 4 5 6 7 7 7 7 7 8 8 8 9 9 10 10 10 10]; nx= (1:max(ix)).'; ac=accumarray(ix.',1); r=repmat(nx(ac>=3),1,3)
Functia accumarray tutorial:
Contruieste un array prin acumulare.
Sintaxa generala:
A =accumarray(subs,val) - creeaza un array A acumuland elementele din vectorul val si utilizand ca subscript-uri in subs (unde subs este un vector initial dat).
Fiecare element din val are un rand corespunzator in subs. Practic subs defineste un tablou n-dimensional in iesirea lui A.
Practic accumarray colecteaza toate elementele lui val (care este la randul lui ca si subs un vector sau o constanta) care corespund identic subscript-urilor din subs, sumeaza aceste valori si stocheaza rezultatul in elementul lui A.
Elementele lui A nu sunt referite de nici un rand al lui subs care contine valoarea 0.
Deci vectorul subs trebuie neaparat sa contine doar numere intregi pozitive!!!!
Daca subs este o matrice cu nr. de coloane >1 atunci A este un tablou n- dimensional ce are marimea max(subs,[],1).
Daca subs este o matrice goala (fara elemente -contine NaN) cu nr. de coloane >1 atunci A este un tablou n dimensional gol cu marimea 0x0 0x0...0x0.
Variabila subs poate contine deasemenea un vector coloana, iar A este deasemenea un vector coloana.
In acest caz A are lungimea max(subs,[],1) cand subs nu este gol si lungimea =0 cand subs este gol.
subs - poate fi un vector de celule cu unul sau mai multe elemente, fiecare vector fiind format di numere pozitive intregi!!!!. Deasemenea toti vectorii trebuie sa aiba aceeasi lungime. In acest caz subs este tratat ca si cum vectorii formeaza coloane ale unui matrici subscript. val- trebuie sa fie numeric, logical sau un vector de caractere cu aceeasi lungime ca si numarul de randuri din subs!!!
val - deasemenea poate fi si un scalar a carui valori sunt repetate pt. toate randurile lui subs
Pracitc accumarray sumeaza valorile din val folosind comportamentul functiei sum (care insuma toate elementele unui array). Pt. accumarray exista 4 tipuri de sintaxe generale:
1) A = ACCUMARRAY(SUBS,VAL,SZ) - creeaza un array A cu marimea SZ , unde SZ este un vector de numere intregi pozitive.
Daca SUBS nu este vid (are elemente) si nr.de coloane>1 atunci SZ trebuie sa aiba n elemente unde all(SZ>=max(SUBS,[],1). Specificam SZ ca [] pt. comportament default.
2) A = ACCUMARRAY(SUBS,VAL,SZ,FUN) - aplica functia FUN fiecarui subset al elementelor din VAL
FUN - este o functie care accepta un vector coloana si intorce numeric, logical sau scalar char, sau scalar cell. A are aceeasi clasa ca valorile intoarse de functia FUN. FUN este @SUM ca default. Specificam FUN ca [] pt. comportament default.
Obs. Daca subscript-urile din SUBS nu sunt sortate, FUN nu trebuie sa depinda de ordinea valorilor in datele de intrare.
3) A = ACCUMARRAY(SUBS,VAL,SZ,FUN,FILLVAL) - pune valoarea scalara FILLVAL in elementele lui A care nu sunt referit de nici un rand al lui SUBS.
De exemplu daca SUBS este gol atunci A este repmat(FILLVAL,SZ). FILLVALL si valorile intoarse de FUN trebuie sa fie din aceeasi clasa (Same Class!).
4) A = ACCUMARRAY(SUBS,VAL,SZ,FUN,FILLVAL,ISSPARSE) creeaza un array A care este sparse (deci contine si valori de 0 vectorul respectiv) daca scalarul logic ISSPARSE este true (adevarat) sau full daca scalarul logic ISSPARSE este false.
A este full default. FILLVAL trebuie sa fie 0 sau [] daca scalarul logic ISSPARSE este true. VAL si iesirea functiei FUN trebuie sa fie double daca scalarul logic ISSPARSE este true.
EXEMPLE:
Exemplul 1: Creeaza un vector 5x1 sumeaza valorile pt.subscripturi 1D subs = [1; 2; 4; 2; 4]; A = accumarray(subs, 101:105)
Efect:
A =
101 206 0 208 Exemplul 2: Creeaza un array 2x3x2 sumeaza valorile pt.subscripturi 3D repetate subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2]; A = accumarray(subs, 101:105) Efect:
A(:,:,1) =
101 0 0 0 0 0
A(:,:,2) =
0 0 0 206 0 208
Exemplul 3: Creeaza un array 2x3x2 sumand valorile nativ
subs = [1 1 1; 2 1 2; 2 3 2; 2 1 2; 2 3 2]; A = accumarray(subs, int8(101:105), [], @(x) sum(x,'native')) class(A) Efect:
A(:,:,1) =
101 0 0 0 0 0
A(:,:,2) =
0 0 0 127 0 127
ans =
int8 Exemplul 4: Creeaza un array folosind max si completeaza elementele goale cu NaN subs = [1 1; 2 1; 2 3; 2 1; 2 3]; A = accumarray(subs, 101:105, [2 4], @max, NaN) Efect:
A =
101 NaN NaN NaN 104 NaN 105 NaN
Exemplul 5: Creeaza o matrice sparse (ce contine si elem=0) folosind prod
subs = [1 1; 2 1; 2 3; 2 1; 2 3]; A = accumarray(subs, 101:105, [2 4], @prod, 0, true)
Efect:
A =
(1,1) 101 (2,1) 10608 (2,3) 10815 Exemplul 6: Numara cate subscript-uri pt.fiecare bin (number of subscript for each bin) subs = [1 1; 2 1; 2 3; 2 1; 2 3]; A = accumarray(subs, 1, [2 4])
Efect:
A =
1 0 0 0 2 0 2 0
Exemplul 7: Creeaza un logical array indicand bins-urile cu 2 sau mai multe valori subs = [1 1; 2 1; 2 3; 2 1; 2 3]; A = accumarray(subs, 101:105, [2 4], @(x) length(x)>1)
Efect:
A =
0 0 0 0 1 0 1 0
Exemplul 8: Grupeaza valorile intr-un cell-array
subs = [1 1; 2 1; 2 3; 2 1; 2 3]; A = accumarray(subs, 101:105, [2 4], @(x) {x}) A{2}
Efect:
A =
[ 101] [] [] [] [2x1 double] [] [2x1 double] []
ans =
104 102
|
|