ciao a tutti,
Su Matlab ho:
-una matrice 'A' di N righe e M colonne
-un vettore di B elementi
Devo fare una condizione per controllare che ciascuna riga di 'A' contenga almeno uno degli elementi di 'B'. Devo controllare riga per riga della matrice, se la condizione si verifica aggiorno un contatore, se non si verifica la condizione non faccio nulla e passo alla riga della matrice successiva.
Come posso fare?? Con che codice/funzione ?
grazie mille a tutti anticipatamente!!
problema matlab
13 messaggi
• Pagina 1 di 2 • 1, 2
0
voti
rugweri ha scritto:Tu quale ipotesi di codice (o almeno quale algoritmo di principio) hai in mente?
in realtà l'unica cosa che mi viene in mente è prendere il primo elemento di B e scorrere la prima riga di A,se tale elemento è presente nella prima riga si aggiorna il contatore; se non è presente si passa al secondo elemento di B e si controlla se è nella prima riga di A, e cosi via fino all'ultimo elemento di B. Se è presente l'elemento di B nella prima riga di A si aumenta il contatore, altrimenti se nessun elemento di B è presente nella prima di riga di A, si considera la seconda riga di A e si ripete il procedimento.
Questo procedimento che penso si possa fare con for e if però richiederebbe troppi if e for e vorrei semplificare per esempio usando funzioni già di matlab
grazie mille!!!
0
voti
ciao,
probabilmente/sicuramente tale funzione è adatta per te:
https://it.mathworks.com/help/matlab/ref/find.html
probabilmente/sicuramente tale funzione è adatta per te:
https://it.mathworks.com/help/matlab/ref/find.html
0
voti
micdisav ha scritto:ciao,
probabilmente/sicuramente tale funzione è adatta per te:
https://it.mathworks.com/help/matlab/ref/find.html
ciao purtroppo la funzione find mi restituisce gli indici degli elementi non nulli e in questo caso non penso mi sia utile
grazie comunque lo stesso
0
voti
giako23 ha scritto:in realtà l'unica cosa che mi viene in mente è prendere il primo elemento di B e scorrere la prima riga di A,se tale elemento è presente nella prima riga si aggiorna il contatore; se non è presente si passa al secondo elemento di B e si controlla se è nella prima riga di A, e cosi via fino all'ultimo elemento di B. Se è presente l'elemento di B nella prima riga di A si aumenta il contatore, altrimenti se nessun elemento di B è presente nella prima di riga di A, si considera la seconda riga di A e si ripete il procedimento.
Benissimo, ti va di scriverlo in Matlab?
Lo so che hai scritto che vorresti semplificare... ma da qualche parte dobbiamo partire, e ritengo che sia didatticamente sensato farlo da qualcosa di tuo.
-

rugweri
5.948 2 8 13 - CRU - Account cancellato su Richiesta utente
- Messaggi: 1366
- Iscritto il: 25 nov 2016, 18:46
0
voti
- Codice: Seleziona tutto
clc
clear
M = [1,2,5,5; 1,1,7,8; 2,3,4,3; 8,8,8,8] %M matrice 4x4
V = [10,8,5,1] %V elementi da trovare
nv = numel(V) %numero elementi V
rm = numel(M(:,1)) %numero righe di M
RowsAlmostOneElementV = 0 %contatore
for irm = 1:rm %scandisce rows M
skip_remains_row = 0; %flag per saltare resto row se trova elemento V
for inv = 1:nv %scandisce elementi V
elementoVcercato = V(inv) %solo debug: mostra elemento V
X = find(M(irm,:)==V(inv)) %colonne in cui trova V(inv)
if length(X) > 0 %controllo NON VUOTO: c'è elemento V
%trovato uno degli elementi V, incrementa contatore RowsAlmostOneElementV ed esci dal for inv (+interno)
RowsAlmostOneElementV = RowsAlmostOneElementV + 1;
skip_remains_row = 1; %trovato elemento V; salta resto riga
break;
end
end
if skip_remains_row
continue %passa a prossimo irm (= salta resto riga)
end
end
RowsAlmostOneElementV %result
ciao,
piccolo script in matlab con find(), non lo commento esplicitamente perché ho inserito i % matlab.
Se trova un elemento nella riga matrice corrispondente a un elemento dell'array lineare (voluto) aumenta il contatore e/ma salta il resto della riga matrice che stava esaminando.
Se non è tale il comportamento voluto, si può ovviamente modificare.
Saluti, Michele.
Ultima modifica di
micdisav il 28 apr 2022, 13:31, modificato 2 volte in totale.
0
voti
micdisav ha scritto:
- Codice: Seleziona tutto
clc
clear
M = [1,2,5,5; 1,1,7,8; 2,3,4,3; 8,8,8,8] %M matrice 4x4
V = [10,8,5,1] %V elementi da trovare
nv = numel(V) %numero elementi V
rm = numel(M(:,1)) %numero righe di M
RowsAlmostOneElementV = 0 %contatore
for irm = 1:rm %scandisce rows M
skip_remains_row = 0; %flag per saltare resto row se trova elemento V
for inv = 1:nv %scandisce elementi V
elementoVcercato = V(inv) %solo debug: mostra elemento V
X = find(M(irm,:)==V(inv)) %colonne in cui trova V(inv)
if length(X) > 0 %controllo NON VUOTO: c'è elemento V
%trovato uno degli elementi V, incrementa c ed esci dal for inv
RowsAlmostOneElementV = RowsAlmostOneElementV + 1;
skip_remains_row = 1; %trovato elemento V; salta resto riga
break;
end
end
if skip_remains_row
continue %passa a prossimo irm (salta resto riga)
end
end
RowsAlmostOneElementV %result
ciao,
piccolo script in matlab con find(), non lo commento esplicitamente perché ho inserito i % matlab.
Se trova un elemento nella riga matrice corrispondente a un elemento dell'array lineare (voluto) aumenta il contatore e/ma salta il resto della riga matrice che stava esaminando.
Se non è tale il comportamento voluto, si può ovviamente modificare.
Saluti, Michele.
Perfetto Michele!! Grazie mille!!
0
voti
Non so se ho inteso bene il problema ma userei ismember
- Codice: Seleziona tutto
A = [1,2,7,5; 1,1,3,8; 2,1,6,3; 7,8,2,4; 3,5,7,9]
B = [1,8,0]
C = ismember(A,B) % posizione elem.
D = sum (C,2) % num. elem. nella riga
N = sum (D>=1) % num. righe contenenti almeno un elem.
V = prod(D)>0
"Il circuito ha sempre ragione" (Luigi Malesani)
13 messaggi
• Pagina 1 di 2 • 1, 2
Torna a Programmi applicativi: simulatori, CAD ed altro
Chi c’è in linea
Visitano il forum: Nessuno e 1 ospite

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)



