나는 매트릭스 연산을 수행하는데 필요한 0-1 벡터를 가지고있다. 그것들은별로 희박하지는 않습니다 (값의 절반 만이 0입니다). 이중 대신에 논리적 변수로 저장하면 논리적 변수에 1 바이트, 이중 부동 소수점에 8 바이트의 메모리가 8 배 절약됩니다.논리 변수를 double과 혼합하는 것이 더 느린가요?
두 값을 모두 사용하는 것보다 논리 벡터와 이중 행렬의 행렬 곱셈을 더 느리게 수행 할 수 있습니까? 아래에있는 내 예비 결과를 참조하십시오
>> 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 명령어 세트의 한계입니까?
편집 : 내 시스템은 맥 OS X 10.8.3에 MATLAB R2012b, 인텔 코어 i7 3.4 GHz의
EDIT2입니다 : 몇 가지 의견이 맥 OS X의 만 문제가에 내가하고 싶은 것을 보여주기 위해 가능한 경우 다양한 아키텍처 및 운영 체제의 결과를 컴파일하십시오.
EDIT3 : 실제 문제는 길이가 m
인 가능한 모든 이진 벡터로 계산해야합니다. m
은 너무 커서 메모리에 맞출 수 없습니다.
이것은 MATLAB이'A '를 곱하기 전에 암시 적으로'logical'을'double'으로 변환한다는 것과 관련이 있다고 생각합니다. –
타이밍은 '0.161891/0.057331/0.049061' 초와 다릅니다. –
R2013a Vista32 인텔 코어 듀오 T9300 :'0.216960/0.026960/0.081925' 초. – Oleg