Aiuto con matlab

Messaggioda jennije » 18/09/2012, 09:43

Salve ragazzi. Ho un problema con l'esame di informatica che dovrò fare a breve.
Devo risolvere questo esercizio ma non so impostarlo. Mi aiutereste gentilmente...?. :)
Scrivere una function in linguaggio Matlab che preveda in input un vettore v ed effettui le seguenti
operazioni:
- costruisca la matrice quadrata simmetrica che abbia il generico elemento di posto (i,j)
definito da |v(i)-v(j)|;
- calcoli la somma degli elementi della prima riga, dell’ultima riga, della prima colonna e
dell’ultima colonna senza ripetizioni, divida la somma per NXN e conti quanti elementi della
matrice sono minori del numero ottenuto ;
- restituisca la matrice, la somma, la somma divisa per NxN e il contatore.
L’uso della vettorizzazione è facoltativo.
jennije
Starting Member
Starting Member
 
Messaggio: 1 di 10
Iscritto il: 18/09/2012, 09:37

Messaggioda Rggb » 18/09/2012, 12:17

Ho letto il tuo messaggio. Non conosco Matlab - anche se prima o poi "mi toccherà", come suol dirsi. Però si trovano sul web migliaia di documenti, esempio questo tutorial
http://www.math.ufl.edu/help/matlab-tutorial/
Avatar utente
Rggb
Cannot live without
Cannot live without
 
Messaggio: 1992 di 3226
Iscritto il: 30/07/2009, 17:27

Re: Aiuto con matlab

Messaggioda jennije » 18/09/2012, 12:33

Ne ho visti tanti manuali ma non so impostare la matrice purtroppo.... comunque grazie lo stesso....
jennije
Starting Member
Starting Member
 
Messaggio: 2 di 10
Iscritto il: 18/09/2012, 09:37

Re: Aiuto con matlab

Messaggioda apatriarca » 18/09/2012, 13:53

Per il primo punto il one-liner è:
Codice:
A = abs( bsxfun( @minus, v, v' ) );

dove abs calcola il valore assoluto di tutti gli elementi della matrice passata come argomento, bsxfun è una funzione particolare che applica una operazione binaria (@minus rappresenta la sottrazione) a tutti gli elementi delle due matrici passate come secondo e terzo argomento in cui si suppone che le matrici siano state espanse lungo la direzione in cui hanno dimensione uno in modo da uguagliare le dimensioni delle due matrici. Mi rendo conto che sembra complicato, ma una volta che si comprende il suo significato è decisamente potente (ed efficiente..).

In alternativa si può anche usare repmat (che però è più lento perché crea diverse matrici intermedie):
Codice:
A = abs( repmat(v,length(v),1) - repmat(v', 1, length(v)) );

repmat crea una matrice che contiene diverse copie della matrice passata come primo argomento (repmat(A,m,n) crea una matrice che contiene m x n copie di A). Ho supposto che v sia una matrice riga..

Infine puoi ovviamente usare dei cicli come nel codice seguente (personalmente preferisco la prima versione anche solo per il piacere di essere riuscito a scrivere tutto in una sola linea..):
Codice:
A = zeros(length(v));
for i=1:length(v)
    for j=1:length(v)
        A(i, j) = abs(v(i) - v(j));
    end
end

Probabilmente, se sei alle prime armi, conviene usare questa ultima versione.

Per calcolare la somma degli elementi di un qualche vettore esiste la funzione sum. Se estrai le righe e le colonne con codici tipo A(1,:) e A(:,1), allora dovresti riuscire a scrivere senza problemi il codice per la seconda parte. Per contare il numero di elementi della matrice minori di un certo numero puoi semplicemente scrivere un ciclo con un contatore all'interno. In alternativa puoi usare qualcosa come il seguente (forse è necessario un cast in Matlab - sto usando Octave):
Codice:
count = sum( sum( A < num ) );

Ti consiglio di usare i cicli se non hai idea di quale sia il significato della riga precedente.
apatriarca
Moderatore
Moderatore
 
Messaggio: 2337 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Aiuto con matlab

Messaggioda jennije » 18/09/2012, 14:26

Scusa quale matrice passata se la devo creare io???
jennije
Starting Member
Starting Member
 
Messaggio: 3 di 10
Iscritto il: 18/09/2012, 09:37

Re: Aiuto con matlab

Messaggioda apatriarca » 18/09/2012, 14:42

Ma a cosa ti riferisci? Quando parlo di matrice passata come argomento di qualcosa nel precedente post mi riferisco sempre a funzioni che sto chiamando io come bsxfun o sum o repmat.. In ogni caso, un vettore (quindi una matrice riga o colonna) viene passato alla tua funzione.
apatriarca
Moderatore
Moderatore
 
Messaggio: 2339 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Aiuto con matlab

Messaggioda jennije » 18/09/2012, 14:54

Siccome sono una frana con la programmazione..mi potresti dire tutto passo passo dall'inizio??? piccola nota: per questo esame è previsto l'uso di freemat che ha le stesse caratteristiche del M.
jennije
Starting Member
Starting Member
 
Messaggio: 4 di 10
Iscritto il: 18/09/2012, 09:37

Re: Aiuto con matlab

Messaggioda apatriarca » 18/09/2012, 15:51

Ma hai almeno idea di come si crei una funzione in matlab? Non conosco freemat.. ma non sembrano in effetti esserci differenze sostanziali.
apatriarca
Moderatore
Moderatore
 
Messaggio: 2340 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid

Re: Aiuto con matlab

Messaggioda jennije » 18/09/2012, 16:05

Si teoricamente so tutto, il mio problema è applicarmi agli esercizi... Ho davvero difficoltà.. :(
jennije
Starting Member
Starting Member
 
Messaggio: 5 di 10
Iscritto il: 18/09/2012, 09:37

Re: Aiuto con matlab

Messaggioda apatriarca » 18/09/2012, 16:12

Ma prova a scrivere qualcosa.. se non altro una funzione vuota che riceve in input un vettore e che restituisce la matrice, la somma, la somma divisa per NxN e il contatore.
apatriarca
Moderatore
Moderatore
 
Messaggio: 2341 di 10436
Iscritto il: 08/12/2008, 20:37
Località: Madrid


Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite