Tabella di verità

di il
1 risposte

Tabella di verità

Salve, sono nuovo del mondo matlab e sto avendo un problema a generare una tabella di verità del tipo indicato sotto, ogni lettera a e b indica un certo tipo di dispositivo, ed a_0 ---- b_2 sono gli stati di un particolare dispositivo, le righe della tabella di verità indicato le possibili combinazioni di dispositivi nei loro possibili stati, l'unico vincolo è quello che ogni dispositivo può avere solo uno stato attivo alla volta, un' esempio e fornito di seguito in cui ci sono due dispositivi a con due stati possibili e b con 3 stati possibili.

Io vorrei creare uno script che a partire da questi dati ( a con 2 stati, b con 3 stati) mi generi una matrice di zeri e uni come quella sotto.
Chiaramente vorrei che fosse un algoritmo generico in cui possa scegliere un numero arbitrario di dispositivi aventi ognuno un numero arbitrario di stati possibili.
E da stamattina che ci provo ma non ci sto riuscendo, vi ringrazio in anticipo per l'aiuto.


a_0 a_1 b_0 b_1 b_2

1 0 1 0 0
1 0 0 1 0
1 0 0 0 1
0 1 1 0 0
0 1 0 1 0
0 1 0 0 1

1 Risposte

  • Re: Tabella di verità

    Credo di avere trovato una soluzione (di sicuro non una particolarmente elegante).
    Ho fatto un po' di tests, ma bisognerebbe farne di più per essere sicuri che funzioni per tutte le combinazioni "dispositivi-stati".

    La funzione riceve in input un vettore che definisce il numero di stati di ogni dispositivo (nel caso della tua domanda, l'input è il vettore [2 3]).
    Il numero di dispositivi viene identificato in base alla lunghezza del vettore in input (in questo caso, 2).

    La soluzione si basa sulla creazione delle tabelle di verità base per ogni dispositivo usando la funzione eye.

    Scorrendo la lista dei dispositivi dall'ultimo al primo (nel caso della tua domanda partendo da quello con 3 stati per passare poi a quello con 2 stati), viene prima replicata la tabella di verità dell'ultimo dispositivo per la combinazione delle tabelle di verità dei rimanenti dispositivi.

    Dal penultimo in poi (sempre scorrendo la lista a ritroso) vengono replicate le singole righe delle varia tabelle di verità per il numero di combinazioni ottenibili dagli stati dei dispositivi che precedono e seguono quello corrente.

    MI rendo conto che questa descrizione è un po' "oscura", è un po' complicato descrive in poche parole l'algoritmo.

    Nel codice ho inserito dei commenti che, spero, rendano più chiaro il funzionamento della funzione.
    
    function tv=truth_table(n_stat)
    %TRUTH_TABLE genera la tabella di verità indicato le possibili combinazioni
    %di dispositivi nei loro possibili stati, l'unico vincolo è quello che ogni
    %dispositivo può avere solo uno stato attivo alla volta
    %
    % INPUT: vettore contenente, per ogni dispositivo, il numero di stati
    % possibili:
    %   ESEMPIO: dati due dispsitivi "a" con due stati e "b" con tre stati
    %   possibili ==> a_0 a_1 b_0 b_1 b_2, l'input deve essere il vettore [2 3]
    %
    % OUTPUT: la tabella di verità
    %
    % Identificazione del numero di dispositivi
    %
    n_disp=length(n_stat);
    %
    % Inizializzazione contatore numero dispositivi: viene settato al numero
    % totale dei dispositivi, ad ogni iterazione viene decrementato, in questo
    % modi la lista dei dispositivi viese scorsa "al contrario
    %
    cnt=n_disp;
    %
    % Creazione di una copia temporanea del numero di stati
    tmp_n_stat=n_stat;
    %
    % Il numero di stati del dispositivo corrente viene settato a 1 (il numero
    % degli stati viene moltiplicato ad ogni iterazione per calcolare il numero
    % di replice delle singole tabelle di verità
    %
    tmp_n_stat(cnt)=1;
    %
    % Creazione della tabella di verità "base" per il dispositivo corrente
    %
    tmp_disp=eye(n_stat(end))
    %
    % Replica della tabella verità dell'ultimo dispositivo
    %
    tmp_disp=repmat(tmp_disp,prod(tmp_n_stat),1)
    %
    % Aggiunta della tabella di verità dell'ultimo dispositivo alla matrice di
    % output
    tv=tmp_disp;
    %
    % Loop (a ritroso) sui rimanenti dispositivi
    %
    for i=n_disp-1:-1:1
       %
       % Decremento del contatore per scorrere i dispositivi "a ritroso"
       %
       cnt=cnt-1;
       %
       % Il numero di stati del dispositivo corrente viene posto uguale a 1 (il
       % suo valore non deve essere considerato nel calcolo delle combinazioni
       %
       tmp_n_stat(cnt)=1;
       %
       % Inizializzazione della tabella di verità per il dispositivo corrente
       %
       e_r=[];
       %
       % Creazione della tabella di verità "base" per il dispositivo corrente
       %
       tmp_disp=eye(n_stat(i))
       %
       % Replica delle singole righe della tabella di verità "base" per il
       % dispositivo corrente per il numero di righe delle tabelle di verità
       % dei dispositivi già considerati
       %
       for j=1:length(tmp_disp)
          e_r=[e_r;repmat(tmp_disp(j,:),prod(n_stat(cnt+1:end)),1)]
       end
       %
       % Replica della tabella di verità del dispositivo corrente per il numero
       % di righe delle tabelle di verità dei dispositivi ancora da considerare
       % (non si applica all'ultimo dispositivo
       %
       if(i > 1)
          e_r=[e_r;repmat(e_r,prod(n_stat(1:cnt-1))-1,1)]
       end
       %
       % Aggiunta della tabella di verità del dispositivo corrente alla tabella
       % di output
       %
       tv=[e_r tv];
    end   
    
    Hope this helps.
Devi accedere o registrarti per scrivere nel forum
1 risposte