Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

problema matlab

Strumenti informatici per la matematica applicata, le simulazioni, il disegno: Mathcad, Matlab, Scilab, Microcap, PSpice, AutoCad ...

Moderatori: Foto Utenteg.schgor, Foto Utentedimaios

0
voti

[1] problema matlab

Messaggioda Foto Utentegiako23 » 27 apr 2022, 11:13

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!!
Avatar utente
Foto Utentegiako23
0 3
 
Messaggi: 39
Iscritto il: 8 apr 2022, 17:38

0
voti

[2] Re: problema matlab

Messaggioda Foto Utenterugweri » 27 apr 2022, 16:17

Tu quale ipotesi di codice (o almeno quale algoritmo di principio) hai in mente?
Avatar utente
Foto Utenterugweri
5.948 2 8 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[3] Re: problema matlab

Messaggioda Foto Utentegiako23 » 27 apr 2022, 17:08

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!!!
Avatar utente
Foto Utentegiako23
0 3
 
Messaggi: 39
Iscritto il: 8 apr 2022, 17:38

0
voti

[4] Re: problema matlab

Messaggioda Foto Utentemicdisav » 27 apr 2022, 20:19

ciao,
probabilmente/sicuramente tale funzione è adatta per te:
https://it.mathworks.com/help/matlab/ref/find.html
Avatar utente
Foto Utentemicdisav
271 7
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 17 giu 2020, 16:40

0
voti

[5] Re: problema matlab

Messaggioda Foto Utentegiako23 » 27 apr 2022, 21:13

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
Avatar utente
Foto Utentegiako23
0 3
 
Messaggi: 39
Iscritto il: 8 apr 2022, 17:38

0
voti

[6] Re: problema matlab

Messaggioda Foto Utenterugweri » 28 apr 2022, 0:07

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.
Avatar utente
Foto Utenterugweri
5.948 2 8 13
CRU - Account cancellato su Richiesta utente
 
Messaggi: 1366
Iscritto il: 25 nov 2016, 18:46

0
voti

[7] Re: problema matlab

Messaggioda Foto Utentemicdisav » 28 apr 2022, 13:16

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 Foto Utentemicdisav il 28 apr 2022, 13:31, modificato 2 volte in totale.
Avatar utente
Foto Utentemicdisav
271 7
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 17 giu 2020, 16:40

0
voti

[8] Re: problema matlab

Messaggioda Foto Utentegiako23 » 28 apr 2022, 13:25

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
Avatar utente
Foto Utentegiako23
0 3
 
Messaggi: 39
Iscritto il: 8 apr 2022, 17:38

0
voti

[9] Re: problema matlab

Messaggioda Foto UtenteRenzoDF » 28 apr 2022, 15:39

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)
Avatar utente
Foto UtenteRenzoDF
55,9k 8 12 13
G.Master EY
G.Master EY
 
Messaggi: 13189
Iscritto il: 4 ott 2008, 9:55

0
voti

[10] Re: problema matlab

Messaggioda Foto Utentemicdisav » 28 apr 2022, 16:07

grazie renzoDF per il contributo.
Avatar utente
Foto Utentemicdisav
271 7
Frequentatore
Frequentatore
 
Messaggi: 147
Iscritto il: 17 giu 2020, 16:40

Prossimo

Torna a Programmi applicativi: simulatori, CAD ed altro

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti