Я сравниваю два двоичных массива. У меня есть массив, где значения могут или быть единицей или нулем, та, если значения являются тем же и нулем, если они не. Обратите внимание, что я делаю другой материал вне проверки, таким образом, мы не должны входить в векторизацию или природу кода.
Что более эффективно, с помощью числового массива или логического массива в MATLAB?
Логические значения занимают меньше байт, чем большинство числовых значений, что является плюсом, если вы имеете дело с очень большими массивами. Вы также можете использовать логические массивы для логического индексирования. Например:
>> 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
Одно замечание: Если вы будете иметь дело с массивами нулей и единиц, которые очень разрежены (т.е. очень мало единиц), возможно, лучше использовать массив числовых индексов, таких как вы получите из функции FIND.Возьмем следующий пример:
>> 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
Логично конечно! В Matlab есть возможность сжать 8 элементов в 1 байт. (Будет это или нет - другой вопрос).
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
result
4.561173 seconds
3.454697 seconds
, но выгода будет намного больше, если вы будете выполнять больше логических операций, а не просто зацикливаться!