Fast multiplication: binary matrix with double matrix
이전 댓글 표시
Hello everyone,
I am trying to speed up my Matlab code at the moment. The most time consuming part of the code is the multiplication of two matrices A*B, where A is binary (only 0 or 1 entries) and B is a double matrix.
The size of the matrices isn't that large, it's only time consuming because its in the inner loop of some iteration and thus is performed 100k upto a million times. (The matrix B is changing in each iteration, but A stays the same.) So each bit of performance speed-up could help me out here.
At the moment, I am just converting A from binary to double and use the standard matrix multiplication A*B. However, I wonder if there is a faster way to do it. since A is binary, A*B is not a 'real multiplication' but just an addition of some elements of B (defined by the non-zero pattern of A). Anyone has a clue how to do so? And neither A nor B are sparse, if that is important.
댓글 수: 5
Jos (10584)
2019년 8월 6일
matrix muliplication is highly optimized. I doubt that, for instance, summing selected elements of B would be faster. What are the sizes of A and B? And do you need to create B as a separate matrix, or can you use A to create B?
Jos (10584)
2019년 8월 6일
So, just to check, both A and B are square and of the same size? A is a logical matrix, and B is a double matrix created (overwritten) by another function inside a loop?
Writing a mex-function to do this would require the same structure as matrix multiplication (looping and summing) so I doubt you can get it any faster.
What about decreasing the size of A by removing replicated rows?
Florian
2019년 8월 6일
Bruno Luong
2019년 8월 6일
I doubt you can beat MATLAB matrix multiplication (highly optimized) with MEX file. The time depends on little on the number of operations, but memory copying, etc ... count.
답변 (2개)
Walter Roberson
2019년 8월 6일
0 개 추천
It turns out to be faster to leave A as logical when you do the matrix multiplication.
Using logical indexing, or doing find() and adding only those elements, is much slower unless the occupancy fraction drops to below 10% as a rough estimate.
댓글 수: 4
Florian
2019년 8월 6일
Walter Roberson
2019년 8월 6일
If you want addition of some elements selected by A, then you should be using A.*B rather than A*B
Walter Roberson
2019년 8월 6일
Ah, I guess I must have mis-interpreted the question.
Bruno Luong
2019년 8월 6일
편집: Bruno Luong
2019년 8월 6일
Here is two ways, it won't be faster than A*B as other has warned you
n = 512;
A = sprand(n,n,0.1) > 0 ;
B = rand(n,n);
m = size(A,1);
p = size(B,2);
[i,j] = find(A);
C = zeros(m,p);
tic
for k = 1:p
C(:,k) = accumarray(i,reshape(B(j,k),[],1),[m,1]);
end
toc
m = size(A,1);
p = size(B,2);
[i,j] = find(A);
k = 1:p;
[I,K] = ndgrid(i,k);
tic
C = accumarray([I(:),K(:)],reshape(B(j,k),[],1));
toc
tic
C = A*B;
toc
카테고리
도움말 센터 및 File Exchange에서 MATLAB에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!