벡터화 된 행렬 연산 (MATLAB에서 최적화 됨)을 사용하여 동일한 작업을 효율적으로 구현하는 방법에 대한 메모입니다. 이것은 큰 행렬을 위해 엄청난 시간을 절약 할 수 있습니다 :
dat = randn(50, 50);
OP (더블 용) 구현 :
sim = zeros(size(dat));
nRow = size(dat,1);
for j = 1:nRow
x = dat(j, :);
for i = j+1:nRow
y = dat(i, :);
c = dot(x, y);
sim(j, i) = c/(norm(x,2)*norm(y,2));
end
end
벡터화 구현 : 1000
normDat = sqrt(sum(dat.^2, 2)); % L2 norm of each row
datNorm = bsxfun(@rdivide, dat, normDat); % normalize each row
dotProd = datNorm*datNorm'; % dot-product vectorized (redundant!)
sim2 = triu(dotProd, 1); % keep unique upper triangular part
비교 x 1000 매트릭스 : (MATLAB 2013a, x64, Int 엘 코어 i7 960 @ 3.20GHz)
Elapsed time is 34.103095 seconds.
Elapsed time is 0.075208 seconds.
sum(sum(sim-sim2))
ans =
-1.224314766369880e-14
"줄 단위로." 행 방향 또는 열 방향을 의미합니까? – horchler
죄송합니다. 저는 행 방향입니다. a) 선택한 알고리즘 (MATLAB 독립), b) 쌍간 코사인 유사성 (다시 MATLAB 독립) 또는 c) 효율적/빠른 MATLAB 구현을위한 효율적인 알고리즘을 가지고있는 문제가 무엇입니까? – sima412
사이에 문제가 있습니까? 요청되는 내용을 간결하게 작성하십시오. – gevang