2010-06-28 20 views
6

Ich vergleiche zwei binäre Arrays. Ich habe ein Array, in dem Werte entweder eins oder null sein können, eins, wenn die Werte gleich sind und null, wenn sie nicht gleich sind. Bitte beachten Sie, dass ich neben der Überprüfung noch andere Dinge tue, so dass wir nicht auf die Vektorisierung oder die Art des Codes eingehen müssen.Logisches vs Numerisches Array in MATLAB

Was ist effizienter, wenn Sie in MATLAB ein numerisches Array oder ein logisches Array verwenden?

Antwort

5

Logical Werte benötigen weniger Bytes als die meisten numeric Werte, was ein Vorteil ist, wenn Sie mit sehr großen Arrays arbeiten. Sie können auch logische Arrays verwenden, um logical indexing zu tun. Zum Beispiel:

>> 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 

Eine Anmerkung: Wenn Sie mit Arrays von Nullen und Einsen zu tun werden, die sehr spärlich sind (dh nur sehr wenige sind), kann es am besten sein, eine Reihe von numerischen Indizes zu verwenden, wie zum Beispiel Sie würden von der FIND Funktion erhalten. Nehmen Sie das folgende Beispiel:

>> 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

Sehr gute Antwort! – Elpezmuerto

1

Logisch natürlich! Matlab hat die Möglichkeit, 8 Elemente in 1 Byte zu quetschen. (Ob es ist oder nicht ist eine andere Sache).

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 

Ergebnis

4.561173 seconds 
3.454697 seconds 

aber der Nutzen wird viel größer, wenn Sie mehrere logische Operationen eher tun als nur Looping!