Pagina 1 di 2

problema matlab

MessaggioInviato: 27 apr 2022, 11:13
da giako23
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!!

Re: problema matlab

MessaggioInviato: 27 apr 2022, 16:17
da rugweri
Tu quale ipotesi di codice (o almeno quale algoritmo di principio) hai in mente?

Re: problema matlab

MessaggioInviato: 27 apr 2022, 17:08
da giako23
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!!!

Re: problema matlab

MessaggioInviato: 27 apr 2022, 20:19
da micdisav
ciao,
probabilmente/sicuramente tale funzione è adatta per te:
https://it.mathworks.com/help/matlab/ref/find.html

Re: problema matlab

MessaggioInviato: 27 apr 2022, 21:13
da giako23
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

Re: problema matlab

MessaggioInviato: 28 apr 2022, 0:07
da rugweri
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? :D
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.

Re: problema matlab

MessaggioInviato: 28 apr 2022, 13:16
da micdisav
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.

Re: problema matlab

MessaggioInviato: 28 apr 2022, 13:25
da giako23
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!! :D

Re: problema matlab

MessaggioInviato: 28 apr 2022, 15:39
da RenzoDF
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

Re: problema matlab

MessaggioInviato: 28 apr 2022, 16:07
da micdisav
grazie renzoDF per il contributo.