Matlab lavorare con le matrici

Darèios89
Stavo leggendo una guida su Matlab, non ho ben capito alcune funzione dell' operatore "due punti".
Ho letto che se scrivessi una cosa come:

A(1:k:j)

Questo sta ad indicare i primi k elementi della colonna j-esima, ma allora se scrivessi:

A(1,3:1)=0

In questo modo non dovrebbe impostare a 0 i primi 3 valori della prima colonna?
Matlab non lo fa.........

Se voglio invece usare l' operatore per sommare gli elementi di una data colonna, per dire:

A=[1,2,3;4,5,6;7,8,9]

A =

     1     2     3
     4     5     6
     7     8     9

>> I=sum(A(1:3:1))

I =

     1


Perchè non mi somma i 3 elementi della colonna 1?

Risposte
apatriarca
Stai facendo un po' di confusione. Prima di tutto l'espressione a:k:b genera un vettore il cui primo elemento è a, la distanza tra due elementi successivi è k e gli elementi vengono generati finché non si supera b. Se k viene omesso, allora gli elementi hanno distanza 1. Qualche esempio può essere utile:
> 1:10
ans =

    1    2    3    4    5    6    7    8    9   10

> 1:2:10
ans =

    1    3    5    7    9

> 10:-1:1
ans =

   10    9    8    7    6    5    4    3    2    1

> 1:1.5:10
ans =

     1.0000     2.5000     4.0000     5.5000     7.0000     8.5000    10.0000

> 1:1.6:10
ans =

     1.0000     2.6000     4.2000     5.8000     7.4000     9.0000


Questo operatore è molto utile per indicizzare una matrice. A differenza di altri linguaggi infatti, matlab permette di passare un vettore come indice. Quando viene passato un vettore le corrispondenti righe o colonne vengono selezionate. Ti faccio alcuni esempi (inserendo semplicemente : matlab considera tutte le righe o colonne in ordine):
> A = magic(3)
A =

   8   1   6
   3   5   7
   4   9   2

> A([1 1],:)
ans =

   8   1   6
   8   1   6

> A([1 3 2],:)
ans =

   8   1   6
   4   9   2
   3   5   7

> A([1 3 2],[2 2 2])
ans =

   1   1   1
   9   9   9
   5   5   5

> A(1:2,3:-1:1)
ans =

   6   1   8
   7   5   3

Darèios89
Ti ringrazio, ma non ho ancora ben capito come funzionano le ultime istruzioni inserite da te:

Tipo:

A([1 3 2],: )


Così io cosa gli sto dicendo? di considerare quali elementi di quale riga, o colonna? e poi in:

A([1 3 2], [2 2 2])


Qui invece?

Nel primo caso forse consideriamo elementi di una riga, nel secondo invece elementi di una riga e di una colonna?

apatriarca
È comodo pensare in termini di creazione di una nuova matrice e non di selezione di alcuni elementi in questi casi. Stai creando una nuova matrice formata dagli elementi della matrice A originale. Gli elementi saranno presi dalle righe o colonne contenuto nel vettore. Nel primo caso ad esempio stai chiedendo di avere una matrice le cui righe sono la prima riga di A, seguita dalla terza e infine dalla seconda. Le colonne le stai prendendo invece tutte. Stai insomma prendendo la matrice A con la terza e la seconda riga scambiate. Nel secondo caso avrai sempre le stesse righe, ma le colonne saranno invece solo la seconda. Stai cioè ripetendo tre volte la seconda colonna con la secondo e la terza riga scambiati.

Darèios89
Ah ok grazie mille, volevo sapere una cosa inoltre, se volessi ottenere un immagine in negativo, potrei fare una cosa del genere?

A=imread('foto.jpg');
m=size(A,1);
>> n=size(A,2);
>> for i=1:m
       for j=1:n
           A(i,j)=255-A(i,j);
end
end
>> figure,imshow(A);
>> 


La foto che ottengo non mi sembra in negativo...
E poi, provavo a leggere sempre su Matlab la funzione SUBPLOT, ma non ho capito come usarla.....per fare apparire ad esempio in un' unìca finestra le due immagini affiancate, oppure una sopra e una sotto, non ho capito insomma come funzionano i parametri da passare al metodo e come visualizzare il tutto.

Umby2
"Darèios89":


La foto che ottengo non mi sembra in negativo...


Scusa ma, le foto in formato .jpg sono compresse, se ad esempio un colore di un pixel si ripete piu volte, viene definito il colore ed il numero di ripetizioni (ho semplificato, in realtà è un tantino più complesso).
Quindi per negativizzare non puoi fare cosi'.

Dovresti provare con un .bmp (si tratta di una immagine pixel-pixel), ma anche qui dovresti sapere la grandezza di ogni pixel. Potrebbe essere a 8 bit, 16, 24, e quindi regolarti di conseguenza..

Darèios89
Ah già è vero la compressione, in effetti è il capitolo che devo studiare oggi :oops:
Invece per quanto riguarda il comando SUBPLOT mi sapresti spiegare in che modo è possibile far apparire in una stessa finestra due immagini?

apatriarca
Il problema non è certamente dovuto alla compressione in quanto imread legge l'immagine e la decomprime. Un primo problema potrebbe essere piuttosto quello di capire che cosa ha restituito imread e quale sia la sua dimensione. Inizia quindi a scrivere qualcosa tipo
whos A

per vedere che tipo di variabile è A (ovviamente puoi anche vederlo direttamente dalla GUI di Matlab). Potrebbe essere in diversi formati come descritto nella documentazione di imread. Il tuo metodo mi sembra comunque corretto e penso che potrebbe anche essere un problema della funzione che visualizza l'immagine. Visualizzala anche prima di vedere il suo negativo. Potresti avere delle sorprese. Prova il seguente codice (non è necessario fare un ciclo perché viene fatto in modo automatico in matlab scrivendo 255 - A).
>> A = imread('foto.jpg');
>> B = 255 - A; 
>> subplot(1,2,1), subimage(A);
>> subplot(1,2,2), subimage(B);

subimage serve per visualizzare correttamente più immagini nello stesso figure. Leggiti il manuale.

P.S. La compressione nelle immagini .jpg non ha niente a che fare con la ripetizione di un singolo colore più volte. L'immagine viene prima divisa l'immagine in blocchi, ogni blocco viene quindi trasformato usando la DCT nel dominio della frequenza per poi ridurre il numero di bit usati tramite la quantizzazione. I coefficienti (presi a zig-zag) vengono quindi compressi usando la codifica di Huffman o la codifica aritmetica (LZW). Ti confondi probabilmente con formati come png o gif (in cui è comunque più complesso ma si avvicina di più alla tua descrizione).

P.S.2 Non avevo visto la domanda su subplot. La funzione
subplot(m,n,p)

divide lo spazio disponibile in una griglia m*n e prende in considerazione il p-esimo. Gli spazi vengono contati per riga (prima la prima, poi la seconda e così via). Puoi anche passare un vettore con le coordinate. Ci sono altre opzioni e ti consiglio di leggerti il manuale ma come inizio credo sia sufficiente.

Darèios89
Ah! ok grazie mille, sono riuscito, funziona, si quindi subplot serve a dividere lo spazio in una griglia, di quante righe e colonne mi servono, sono riuscito infatti anche a mettere quattro immagini insieme :-D
Io lo sto facendo per una materia, Interazione e Multimedia, abbastanza complessa, sono fresco fresco e spaventato, ancora non ci so fare nulla e nel progetto ci sono cose allucinanti....filtri, convoluzioni, che nella teoria so più o meno, ma ad applicarlo nella pratica :(
Poi un sacco di confusione con tante cose, oggi ho visto la compressione JPEG, veramente difficile.......
Grazie mille di tutto!

Umby2
"apatriarca":


P.S. La compressione nelle immagini .jpg non ha niente a che fare con la ripetizione di un singolo colore più volte.


Non era mia intenzione spiegare come funzionasse una immagine .jpg, ma solo far capire che la negativizzazione di un file compresso non puo' essere fatta in quel modo.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.