Consiglio su programmazione con Matlab

wolfgang1980
Salve a tutti,
ho una matrice in cui a seconda di determinate condizioni si azzerano delle righe e colonne corrispondenti. Ottenuta tale matrice M(con alcune righe e colonne corrispondenti nulle) devo depurarla delle righe e colonne uguali a 0 e specificare che quest'ultima è la nuova matrice da considerare.
Mi è stato consigliato di azzerare una matrice N di dimensioni (n-r)*(n-r) dove r rappresenta il numero di righe/colonne nulle e mediante un ciclo for di aggiornalra copiando di volta in volta righe e colonne diverse da 0 dalla matrice originaria M.
Il principio secondo me è esatto, volevo solo sapere da voi se è possibile automatizzare il processo nel senso che il numero di righe e colonne nulle "r" dipende da determinate condizioni e bisogna che il codice sia in grado di determinare il numero di tali condizioni. Se vi è utile posso linkarvi (in mp o qui) la parte di codice in questione.
Grazie tante
a presto
Salvatore

Risposte
_luca.barletta
Quasi sempre un ciclo for in matlab è un orrore. Come evitarlo? puoi memorizzare nella variabile index gli indici di righe (e quindi colonne) superstiti; se devi bucare la matrice A allora il codice è

A=A(index,index);

_luca.barletta
Per trovare i valori di index:

B=sum(abs(A));
index=find(B~=0);

wolfgang1980
Grazie 1000 intanto della risposta immediata
Ahahaha perchè in matlab è un orrore un ciclo for ?? Io sto facendo un programma che è pieno zeppo di cicli for :P (ahimè non sono un professionista anzi direi proprio un dilettante)....
a parte questo cmq volevo chiederti questo: col comando "index" devo dirgli io quali colonne e righe della matrice suddetta "bucare"....giusto?....invece mi è stato chiesto di automatizzare il processo :(
Posso mandar un po' di codice qui su questo thread o in mp?
Grazie ancora eh...
a presto

_luca.barletta
vedi il post sopra che ti permette un'automatizzazione; i cicli for sono orridi in matlab perchè il matlab è stato scritto per trattare in modo immediato con vettori e matrici; i for non fanno altro che rallentare il codice e alzare il tempo di elaborazione

PS: con quel codice si sottoindende che A è una matrice quadrata

wolfgang1980
Capisco.
Grazie infinite.......gentilissimo e disponibilissimo. Vado subito a provare la tua soluzione...ti faro' sapere.
Si si la matrice è quadrata tranqui.....

wolfgang1980
Grande luca.barletta.......non so come ringraziarti....funziona davvero il tuo suggerimento. Grazie davvero tanto.....era troppo importante...infatti è il lavoro di tesi.......ti ringrazio veramente di cuore
Per esser sicuri di non aver combinato un casotto ti riepilogo come ho fatto:
B=sum(abs(A));
index=find(B~=0);
A(index,index);
Volevo solo sapere na cosa da te......come mai gli hai fatto scrivere il vettore riga B come somma dei valori assoluti di A? Cioè non si risolve il tutto anche così:
index=find(A~=0);
A(index,index);
Grazie e scusa per l'eventuale disturbo......
ciao ciao
b. serata

_luca.barletta
Se tu vuoi eliminare solo intere righe e colonne formate da zeri devi fare come ti ho descritto. Come hai scritto te fa un casotto.

wolfgang1980
Infatti c'ho provato e ho constatato da solo che non è cosa in quel modo :P.......era solo per spiegarlo pure al prof nei dettagli...
grazie cmq non so davvero come ringraziarti
a presto mitico
Salvatore

_luca.barletta
"wolfgang1980":

a presto mitico


Oh, non è che poi fai come Galeazzi? :-D

wolfgang1980
No no tranquillo.......col mitico galeazzi non ho in comune ne la stazza ne la mitica voce appunto......ehehehe
sciaoooooo

freddofede
"luca.barletta":
Se tu vuoi eliminare solo intere righe e colonne formate da zeri devi fare come ti ho descritto. Come hai scritto te fa un casotto.


Quindi è un comando elemento per elemento... non c'è verso fare riga per riga (o colonna per colonna)?

_luca.barletta
No, anche perchè in quel caso find non ti ritorna il numero di riga o di colonna, ma l'indice di una numerazione progressiva, ad es. se A è NxN e l'elemento in questione è (i,j) ti ritorna i*N+j

_luca.barletta
Una precisazione: se voglio avere gli indici di riga e colonna degli elementi di A che sono uguali al numero a allora uso

[R,C]=find(A==a);


in questo modo se voglio fare un riassegnamento:

A(R,C)=b;

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