Consiglio su programmazione con Matlab
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
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
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);
Per trovare i valori di index:
B=sum(abs(A)); index=find(B~=0);
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
(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
Ahahaha perchè in matlab è un orrore un ciclo for ?? Io sto facendo un programma che è pieno zeppo di cicli for

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
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
PS: con quel codice si sottoindende che A è una matrice quadrata
Capisco.
Grazie infinite.......gentilissimo e disponibilissimo. Vado subito a provare la tua soluzione...ti faro' sapere.
Si si la matrice è quadrata tranqui.....
Grazie infinite.......gentilissimo e disponibilissimo. Vado subito a provare la tua soluzione...ti faro' sapere.
Si si la matrice è quadrata tranqui.....
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
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
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.
Infatti c'ho provato e ho constatato da solo che non è cosa in quel modo
.......era solo per spiegarlo pure al prof nei dettagli...
grazie cmq non so davvero come ringraziarti
a presto mitico
Salvatore

grazie cmq non so davvero come ringraziarti
a presto mitico
Salvatore
"wolfgang1980":
a presto mitico
Oh, non è che poi fai come Galeazzi?

No no tranquillo.......col mitico galeazzi non ho in comune ne la stazza ne la mitica voce appunto......ehehehe
sciaoooooo
sciaoooooo
"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)?
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
Una precisazione: se voglio avere gli indici di riga e colonna degli elementi di A che sono uguali al numero a allora uso
in questo modo se voglio fare un riassegnamento:
[R,C]=find(A==a);
in questo modo se voglio fare un riassegnamento:
A(R,C)=b;