2010-06-28 43 views
6

Tôi so sánh hai mảng nhị phân. Tôi có một mảng trong đó các giá trị có thể là một hoặc không, một giá trị nếu các giá trị giống nhau và không nếu chúng không. Xin lưu ý rằng tôi đang làm các công cụ khác ngoài kiểm tra, vì vậy chúng tôi không cần phải tham gia vào quá trình vector hóa hoặc bản chất của mã.Lô logic và số trong MATLAB

Điều gì hiệu quả hơn, sử dụng mảng số hoặc mảng logic trong MATLAB?

Trả lời

5

Logical giá trị chiếm ít byte hơn hầu hết các giá trị numeric, đây là điểm cộng nếu bạn đang xử lý các mảng rất lớn. Bạn cũng có thể sử dụng các mảng logic để làm logical indexing. Ví dụ:

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

Một lưu ý: Nếu bạn sẽ đối phó với mảng của zero và những người mà rất thưa thớt (tức là rất ít người), nó có thể là tốt nhất để sử dụng một loạt các chỉ số số như bạn sẽ nhận được từ hàm FIND.Đặt ví dụ sau:

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

Câu trả lời rất hay! – Elpezmuerto

1

Tất nhiên là hợp lý! Matlab có tùy chọn ép 8 mục thành 1 byte. (Cho dù nó có hay không là một vấn đề khác).

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 

kết quả

4.561173 seconds 
3.454697 seconds 

nhưng lợi ích sẽ lớn hơn nhiều nếu bạn đang thực hiện các hoạt động hợp lý hơn thay vì chỉ lặp!

Các vấn đề liên quan