Confrontare un array con uno scalare

di il
6 risposte

Confrontare un array con uno scalare

Ciao!

Vorrei confrontare un array con uno scalare evitando il ciclo for.

Con il ciclo for è:

a=randi([1 10],100,1);
b=5;
for i=1:100
if a(i)==b
-->fai qualcosa
end
end

se io invece provo a scrivere

a=randi([1 10],100,1);
b=5;
if a==b
-->fai qualcosa
end

ovviamente matlab mi dice che a e b devono avere la stessa lunghezza.

Grazie in anticipo

6 Risposte

  • Re: Confrontare un array con uno scalare

    scanato ha scritto:


    Ciao!

    Vorrei confrontare un array con uno scalare evitando il ciclo for.

    Con il ciclo for è:

    a=randi([1 10],100,1);
    b=5;
    for i=1:100
    if a(i)==b
    -->fai qualcosa
    end
    end

    se io invece provo a scrivere

    a=randi([1 10],100,1);
    b=5;
    if a==b
    -->fai qualcosa
    end

    ovviamente matlab mi dice che a e b devono avere la stessa lunghezza.

    Grazie in anticipo
    Puoi usare la funzione ismember()

    qui puoi vedere come funziona dalla documentazione ufficiale :
  • Re: Confrontare un array con uno scalare

    Grazie...potrebbe funzionare.

    Però mi sono dimenticato di aggiungere che avrei bisogno anche di mettere la condizione maggiore e minore, non solo uguale
  • Re: Confrontare un array con uno scalare

    Per dare una risposta efficace alla prima domanda è necessario avere qualche dettaglio sulle operazioni che vuoi effettuare nel caso sia verificate la condizione "a(i) == b":
    [*] le istruzioni all'interno dell'"if"dipendono / usano il valore di "i"?
    [*] ha importanza in numero di volte che la condizione "a(i) == b" è verificata?

    La funzione "ismember" suggerita nell'altra risposta ritorna un array di valori "logical" con "1" in corrispondenza delle locazioni nelle quali è verificata l'uguaglianza ("0" nell'altro caso)

    Se vuoi ottenere il valore dell'indice-posizione pupi usare:

    find(a == b)

    In tutti i casi otterrai in output un array come pensi di utilizzarlo per evitare di usare un ciclo for?

    Nella prima domanda hai scritto:
    se io invece provo a scrivere

    a=randi([1 10],100,1);
    b=5;
    if a==b
    -->fai qualcosa
    end

    ovviamente matlab mi dice che a e b devono avere la stessa lunghezza.
    assumo che l'errore venga generato nel set di istruzione "--> fai qualcosa" che non hai riportato perchè, di per sè
    
    a=randi([1 10],100,1);
    b=5;
    if a==b
       c=123
    end
    
    non genera errori (a prescindere da quello che effettivamente significa quel set di istruzioni.

    Dovresti pubblicare anche il set di istruzioni che intendi eseguire in "--> fai qualcosa".

    Per quanto riguarda la seconda domanda:

    Però mi sono dimenticato di aggiungere che avrei bisogno anche di mettere la condizione maggiore e minore, non solo uguale

    non è chiaro cosa intendi, anche in questo caso dovresti pubblicare il codice con in modo che si possa capire come / dove vuoi testare le condizioni "maggiore" e "minore".
  • Re: Confrontare un array con uno scalare

    Giuste osservazioni, quando ho scritto la domanda pensavo non servissero ulteriori informazioni.
    E' un procedimento che mi servirebbe a trovare un valore che rispetta svariate condizioni. Ad esempio ho uno scalare a e il mio vettore b (double 10000x1). Dovrei trovare un singolo valore di b che si trova in un range (a+f)>b>(a-f)... se trovo 0 valori in b allargo il range di ricerca ingrandendo f, se trovo più valori diminuisco f e infine se trovo 1 valore mi fermo.

    a=30;
    f=2;
    n=50000; %attribuisco a n un numero che non potrà mai risultare dalle future iterazioni, così facendo mi assicuro che il primo loop verrà fatto con %f=2 (lo so, sicuramente c'è un modo migliore)
    while length(n)==1 %devo ridurre o aumentare il range finchè non trovo per n un solo valore
    if n==50000 %primo loop
    k=find(b<(a+f)&b>(a-f)); %trova le posizioni del vettore b in cui si verificano le condizioni descritte, parto con range +-2
    n=length(k);
    end
    if n==0
    f=f+0.1;
    k=find(b<(a+f)&b>(a-f));
    n=length(k);
    end
    if n>1
    f=f-0.1;
    k=find(b<(a+f)&b>(a-f));
    n=length(k);
    end
    end


    ora mi rendo conto di aver appesantito parecchio la domanda, quindi riassumendo avrei due domande:
    1-è possibile evitare un ciclo for confrontando l'array b con lo scalare a (per meglio dire a+-f), sempre uguale per ogni iterazione (intendo che "a" rimane costante). Perchè se lo svolgo così ottengo un errore che mi dice che per il confronto le dimensioni devono essere uguali, quidni ora come ora passerei al ciclo for. In altre parole (magari questo esempio è tirato per i capelli) cerco un equivalente del "$lettera$numero" di excel che mi blocca la cella da confrontare.
    2-la struttura del ciclo while così impostata potrebbe funzionare? avreste qualche consiglio?

    forse questa domanda è un po' lunga, vi ringrazio in anticipo
  • Re: Confrontare un array con uno scalare

    A quanto ho capito (correggimi se sbaglio):
    [*] il vettore "b" contiene numeri "double" (non interi)
    [*] non sei interessato ad ottenere, alla fine un particolare valore di "f"
    [*] quello che conta è trovare il valore all'interno del vettore "b" che più si avvicina ad "a" (al limite il valore uguale ad "a", cosa peraltro abbastanza improbabile se "b" contiene valori "double")

    Se è così, si può risolvere il problema senza loop e con una sola linea di codice:
    
    [differenza_minima,idx]=min(abs(b-a))
    Nello specifico:
    
    abs(b-a)
    
    ritorna un vettore nel quale ogni elemento è il valore assoluto della differenza tra il corrispondente valore di "b" ed "a"
    
    [differenza_minima,idx]=min(abs(b-a))
    
    la funzione "min" ritorna in "differenza_minima" il valore minimo del vettore in input (quello delle differenze) ed in "idx" la posizione dell'elemento minimo nel vettore in input.

    Di conseguenza:
    
    b(idx)
    
    è il valore, all'interno del vettore "b" che più si avvicina al valore di "a".

    La variabile "differenza_minima" può essere assimilata al valore di "f" che avresti trovato implementando l'approccio mediante il loop.
  • Re: Confrontare un array con uno scalare

    Eh purtroppo non è così semplice, non posso farlo così.

    Credo che alla fine userò un ciclo for

    Grazie comunque della risposta!
Devi accedere o registrarti per scrivere nel forum
6 risposte