[Eserczio in MatLab]

Messaggioda Gian123 » 28/01/2015, 12:54

Salve a tutti, sono nuovo del forum e anche dell'uso di matlab. Devo effettuare l'analisi su dati di un social network e devo calcolare i degree di un nodo.Avendo un vettore con 260000 valori, l'idea era quella di contare il numero di occorrenze che ogni nodo ha. Ad esempio dato il vettore [1 1 1 2 3 3] vorrei ottenere come risultato che il valore 1 appare 3 volte, il 2 una sola ed il 3 due. C è qualcuno che può darmi una mano nell'implementazione? Grazie.
Ultima modifica di Gian123 il 30/01/2015, 12:15, modificato 1 volta in totale.
Gian123
Starting Member
Starting Member
 
Messaggio: 1 di 12
Iscritto il: 28/01/2015, 12:49

Re: [MatLab]

Messaggioda apatriarca » 28/01/2015, 14:27

Ciao, benvenuto nel forum. Puoi usare qualcosa come il seguente codice:
Codice:
ux = unique(x);
if length(ux) == 1, counts = length(x);
else counts = hist(x,ux); end

La funzione unique restituisce i valori distinti nel vettore che gli viene passato come argomento. La funzione hist restituisce invece il numero di occorrenze. Un'alternativa sarebbe usare qualcosa come il seguente:
Codice:
ux = unique(x);
counts = zeros(size(ux));
for i=1:length(ux)
    counts(i) = sum(x==ux(i));
end

Qui utilizza la funzione sum (si poteva usare anche qualcosa come nnz) per contare gli 1 nel vettore x==ux(i) che contiene i risultati del test x(j)==ux(i) per ogni indice j.. L'ultima alternativa che mi viene in mente (del tutto equivalente a quella precedente ma senza l'uso del ciclo for) è la seguente
Codice:
ux = unique(x)
counts = arrayfun(@(t) nnz(x==t), ux);

Nota che se conosci già i valori distinti del vettore, per esempio interi da 1 a 1000 puoi sostituire unique(x) con qualcosa come 1:1000 che è certamente più efficiente.
apatriarca
Moderatore
Moderatore
 
Messaggio: 3672 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [MatLab]

Messaggioda Gian123 » 28/01/2015, 14:49

Grazie mille, davvero! ho provato e funziona perfettamente!!!....un'ultima info...nel caso volessi fargli eliminare il quei valori che hanno un numero di occerrenza <= ad un valore y? ....Grazie di nuovo per l'aiuto.
Gian123
Starting Member
Starting Member
 
Messaggio: 2 di 12
Iscritto il: 28/01/2015, 12:49

Re: [MatLab]

Messaggioda apatriarca » 28/01/2015, 15:36

Qualcosa come il seguente dovrebbe andare bene:
Codice:
ux2 = ux(counts>y);
apatriarca
Moderatore
Moderatore
 
Messaggio: 3673 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [MatLab]

Messaggioda Gian123 » 29/01/2015, 17:07

[quote='apatriarca'] Apatriarca grazie davvero.Prometto che questa è l'ultima volta che chiedo il tuo aiuto.
ora ho ux2, per esempio [1 2]
ed una matrice del tipo
1 2
1 3
1 4
2 1
2 4
3 2
4 1
4 3

Le mie domande sono due.
1) come faccio a far apparire le sole righe della matrice che possiedono i valori di ux2 sulla prima colonna?
ovvero
1 2
1 3
1 4
2 1
2 4

2) come faccio a far apparire le sole righe della matrice che possiedono i valori di ux2 su entrambe le colonne?
ovvero
1 2
1 3
1 4
2 1
2 4
3 2
4 1

Grazie davvero per il tuo aiuto.E scusami per averti disturbato ancora.
Gian123
Starting Member
Starting Member
 
Messaggio: 3 di 12
Iscritto il: 28/01/2015, 12:49

Re: [MatLab]

Messaggioda apatriarca » 30/01/2015, 10:47

Non ti preoccupare. Notavo ora che il titolo della discussione è decisamente poco descrittiva e che andrebbe cambiato. Cerca in futuro di usare titoli migliori.

In realtà se questo è il tuo obiettivo finale potrebbe convenire agire in modo diverso:
Codice:
M = [1 2; 1 3; 1 4; 2 1; 2 4; 3 2; 4 1; 4 3];
x = M(:,1);
counts = arrayfun(@(t) nnz(x==t), x);
y = 2;
M2 = M(counts > y, :);

Nota che in questo caso il numero di occorrenze è stato calcolato per ogni valore dell'array originale e non solo per i valori distinti.. In questo modo counts può essere usato direttamente per estrarre le righe che ti interessano dalla matrice originale. In caso contrario sarebbe stato un po' più complicato.
apatriarca
Moderatore
Moderatore
 
Messaggio: 3677 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [MatLab]

Messaggioda Gian123 » 30/01/2015, 12:14

apatriarca ha scritto:Non ti preoccupare. Notavo ora che il titolo della discussione è decisamente poco descrittiva e che andrebbe cambiato. Cerca in futuro di usare titoli migliori.

In realtà se questo è il tuo obiettivo finale potrebbe convenire agire in modo diverso:
Codice:
M = [1 2; 1 3; 1 4; 2 1; 2 4; 3 2; 4 1; 4 3];
x = M(:,1);
counts = arrayfun(@(t) nnz(x==t), x);
y = 2;
M2 = M(counts > y, :);

Nota che in questo caso il numero di occorrenze è stato calcolato per ogni valore dell'array originale e non solo per i valori distinti.. In questo modo counts può essere usato direttamente per estrarre le righe che ti interessano dalla matrice originale. In caso contrario sarebbe stato un po' più complicato.


Hai ragione provvedo subito a cambiarla...cmq questa volta non mi torna il risultato dal codice che mi hai inviato. mi prende solamente una aprte della soluzione
Gian123
Starting Member
Starting Member
 
Messaggio: 4 di 12
Iscritto il: 28/01/2015, 12:49

Re: [Eserczio in MatLab]

Messaggioda apatriarca » 30/01/2015, 12:17

Cioè? È possibile abbia in realtà sbagliato a scrivere qualcosa del codice.
apatriarca
Moderatore
Moderatore
 
Messaggio: 3678 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: [Eserczio in MatLab]

Messaggioda Gian123 » 30/01/2015, 12:46

apatriarca ha scritto:Cioè? È possibile abbia in realtà sbagliato a scrivere qualcosa del codice.



la soluzione che ottengo è come se contasse l'occorrenza della prima colonna, mentre a me interessa la seconda, inoltre anche cambiando x = M(:,1); con x = M(:,2); non ottengo il risultato complessivo ma solo una parte
ovvero con il vettore [1 2;1 3;1 4; 2 1; 3 1; 3 2 ;4 1; 4 2; 4 3] so che il grado ( ovvero l 'occorrenza nella seconda colonna) è di 3 per il nodo 1 e 2 ; 2 per il nodo 3 e 1 per il nodo 4. Quindi :
1) in una prima soluzione vorrei una matrice che abbia solo le righe corrispondenti ai nodi 1,2 presenti sulla prima colonna ovvero [1 2;1 3;1 4; 2 1]
2) nell seconda ipotesi vorrei avere una matrice che abbia righe corrispondenti i nodi 1,2 presenti sia sulla prima che sulla seconda ovvero [1 2;1 3;1 4; 2 1; 3 1; 3 2 ;4 1; 4 2]

Spero di averti chiarito un minimo.
Gian123
Gian123
Starting Member
Starting Member
 
Messaggio: 5 di 12
Iscritto il: 28/01/2015, 12:49

Re: [Eserczio in MatLab]

Messaggioda apatriarca » 30/01/2015, 12:50

Ok, in effetti stavo allora cercando di risolvere il problema sbagliato.. :) Puoi provare allora qualcosa come il seguente:
Codice:
M = [1 2;1 3;1 4; 2 1; 3 1; 3 2 ;4 1; 4 2; 4 3];
counts = arrayfun(@(t) nnz(M(:,2)==t), M(:,1));
y = 2;
M2 = M(counts > y, :);

Nota come adesso sto eseguendo la funzione in arrayfun per ogni elemento della prima colonna (il secondo argomento ad arrayfun) confrontando questo valore con quelli presenti nella seconda colonna (test all'interno della funzione). Questo dovrebbe funzionare..
apatriarca
Moderatore
Moderatore
 
Messaggio: 3679 di 10435
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite