Быстрый массив XOR в Matlab - PullRequest
       12

Быстрый массив XOR в Matlab

3 голосов
/ 11 октября 2011

Есть ли более толстый способ xor для каждого столбца матрицы, чем этот?

mod(sum(matrix),2)

Преобразует из логического в удвоение и использует дорогой модуль.

Обновление:

Согласно этому источнику , суммирование uint медленнее, чем суммирование удваивается, потому что это включает в себя максимальное ограничение и другие причины. Также обратите внимание, что логика суммирования (с 'native') останавливается на 1.

Ответы [ 2 ]

2 голосов
/ 11 октября 2011

Я пытался избежать приведения к double, но это не лучше (часто хуже).

A = rand(2000000, 1) > 0.5;
 class(A)

tic
B = mod(sum(A),2)
toc

tic
C = mod(sum(uint32(A),'native'),2)
toc

tic
D = bitand(sum(uint32(A),'native'),1)
toc

Опция native для суммы позволяет вам сохранить тип аргумента в результате.

1 голос
/ 11 октября 2011

В дополнение к тому, что говорит @ClementJ, я попытался

tic
E = A(1)
for i = 2:numel(A)
    E = xor(y, A(i));
end
E
toc

, надеясь, что ускоритель поможет, но это не так (много), и

tic
F = num2cell(A);
F = xor(F{:})
toc

, который не 'на самом деле это работает, потому что XOR допускает только 2 ввода.

Векторная арифметика MATLAB с двойной точностью примерно такая же быстрая, как и раньше, поэтому вы, вероятно, не сможете добиться большего успеха.Если это действительно влияет на вашу производительность, то я предлагаю написать функцию C-MEX: должно быть легко.

...