Логический и числовой массив в MATLAB - PullRequest
6 голосов
/ 28 июня 2010

Я сравниваю два двоичных массива.У меня есть массив, где значения могут быть либо один, либо ноль, один, если значения одинаковы, и ноль, если они не совпадают.Обратите внимание, что я делаю другие вещи, помимо проверки, поэтому нам не нужно вдаваться в векторизацию или природу кода.

Что более эффективно, используя числовой массив или логический массив в MATLAB?

Ответы [ 2 ]

5 голосов
/ 28 июня 2010

Логические значения занимают меньше байтов, чем большинство числовых значений, что является плюсом, если вы имеете дело с очень большими массивами.Вы также можете использовать логические массивы для логического индексирования .Например:

>> 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
1 голос
/ 28 июня 2010

Логично конечно!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

результат

4.561173 seconds
3.454697 seconds

, но выгода будет гораздо больше, если вы будете выполнять больше логических операций, чем просто циклическое выполнение!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...