У меня есть 0-1-значные векторы, для которых мне нужно выполнить некоторые операции с матрицей. Они не очень разрежены (только половина значений равна 0), но сохранение их как логической переменной вместо двойной сохраняет в 8 раз больше памяти: 1 байт для логического и 8 для двойной с плавающей запятой.
Было бы все медленнее делать матричные умножения логического вектора и двойной матрицы, чем использовать их как двойные? Ниже приведены мои предварительные результаты:
>> x = [0 1 0 1 0 1 0 1]; A = rand(numel(x)); xl = logical(x);
>> tic; for k = 1:10000; x * A * x'; end; toc %'
Elapsed time is 0.017682 seconds.
>> tic; for k = 1:10000; xl * A * xl'; end; toc %'
Elapsed time is 0.026810 seconds.
>> xs = sparse(x);
>> tic; for k = 1:10000; xs * A * xs'; end; toc %'
Elapsed time is 0.039566 seconds.
Кажется, что использование логического представления намного медленнее (а разреженный еще медленнее). Может кто-нибудь объяснить, почему? Это время литья типа? Является ли это ограничением набора команд CPU/FPU?
EDIT: Моя система - MATLAB R2012b в Mac OS X 10.8.3, Intel Core i7 3,4 ГГц
EDIT2: Несколько комментариев показывают, что это только проблема с Mac OS X. Я хотел бы скомпилировать результаты из различных архитектур и ОС, если это возможно.
EDIT3: Моя фактическая проблема требует вычисления с огромной частью всех возможных двоичных векторов длины m
, где m
может быть слишком большим для 8 * m * 2^m
для размещения в памяти.