2010-06-28 19 views
6

Sto confrontando due array binari. Ho una matrice in cui i valori possono essere uno o zero, uno se i valori sono uguali e zero se non lo sono. Nota che sto facendo altre cose oltre il controllo, quindi non è necessario entrare nella vettorizzazione o nella natura del codice.Array logico vs numerico in MATLAB

Cosa è più efficiente, utilizzando un array numerico o un array logico in MATLAB?

risposta

5

Logical valori occupano meno byte della maggior parte dei valori numeric, che è un vantaggio se si ha a che fare con array di grandi dimensioni. È anche possibile utilizzare gli array logici per fare logical indexing. Ad esempio:

>> valArray = 1:5;     %# Array of values 
>> numIndex = [0 1 1 0 1];   %# Numeric array of ones and zeroes 
>> binIndex = logical([0 1 1 0 1]); %# Logical array of ones and zeroes 
>> whos 
    Name   Size   Bytes Class  Attributes 

    binIndex  1x5     5 logical  %# 1/8 the number of bytes 
    numIndex  1x5    40 double  %# as a double array 
    valArray  1x5    40 double    

>> b = valArray(binIndex)   %# Logical indexing 

b = 

    2  3  5 

>> b = valArray(find(numIndex))  %# You have to use the FIND function to 
            %# find the indices of the non-zero 
b =         %# values in numIndex 

    2  3  5 

Una nota: Se che fare con matrici di zeri e quelli che sono molto radi (cioè quelli molto pochi), può essere preferibile utilizzare un array di indici numerici, ad esempio si otterrebbe dal FIND function.Take il seguente esempio:

>> binIndex = false(1,10000);  %# A 1-by-10000 logical array 
>> binIndex([2 100 1003]) = true; %# Set 3 values to true 
>> numIndex = find(binIndex)  %# Find the indices of the non-zero values 

numIndex = 

      2   100  1003 

>> whos 
    Name   Size    Bytes Class  Attributes 

    binIndex  1x10000   10000 logical  %# 10000 bytes versus 
    numIndex  1x3     24 double  %# many fewer bytes 
                 %# for a shorter array 
+1

Risposta molto buona! – Elpezmuerto

1

logico, naturalmente! Matlab ha la possibilità di spremere 8 elementi in 1 byte. (Che lo faccia o no è un'altra questione).

a=ones(1000); b=(a==1); 
tic;for(k=1:100)for(i=1:1000);for(j=1:1000);a(i,j)=a(i,j);end;end;end;toc 
tic;for(k=1:100)for(i=1:1000);for(j=1:1000);b(i,j)=b(i,j);end;end;end;toc 

risultato

4.561173 seconds 
3.454697 seconds 

ma il beneficio sarà molto più grande se si sta facendo le operazioni logiche e non solo loop!