패스트 (Fast)는 반드시 전체 벡터화가 아니라 걱정해야합니다. Matlab의 최신 버전은 입니다. 루프를 효율적으로 처리하는 데 훨씬 더 똑똑한입니다. 컴팩트하게 벡터화 된 방식으로 표현하면, 일반적으로 더 빠르지 만, 예전처럼 루프가 (항상) 두려워해서는 안됩니다.
clc
A = rand(5000)>0.5;
A(1,find(sum(A,1)==0)) = 1; % make sure there is at least one match
% Slow because it is doing too much work
tic;[B,I1]=max(cumsum(A));toc
% Fast because FIND is fast and it runs the inner loop
tic;
I3=zeros(1,5000);
for i=1:5000
I3(i) = find(A(:,i),1,'last');
end
toc;
assert(all(I1==I3));
% Even faster because the JIT in Matlab is smart enough now
tic;
I2=zeros(1,5000);
for i=1:5000
I2(i) = 0;
for j=5000:-1:1
if A(j,i)
I2(i) = j;
break;
end
end
end
toc;
assert(all(I1==I2));
R2008a, Windows, x64에서 누적 버전은 0.9 초 걸립니다. 루프 및 찾기 버전은 0.02 초 걸립니다. 더블 루프 버전은 0.001 초 밖에 걸리지 않습니다.
편집 : 가장 빠른 것은 실제 데이터에 따라 다릅니다. 이중 루프는 0.5에서 0.999로 변경하면 0.05 초가 걸립니다 (평균 시간은 휴식 시간에 걸리기 때문에). cumsum 및 루프 & 찾기 구현은보다 일관된 속도를 가지고 있습니다.
편집 2 : gnovice의 플립 솔루션은 영리합니다. 불행히도, 내 테스트 컴퓨터에서 0.1 초 걸립니다, 그래서 그것은 cumsum보다 훨씬 빠르지 만 반복 버전보다 느립니다.
영리한 아이디어. 불행히도, 루프 & 찾기보다 약 5 배 느립니다. –
그것은 다소 기대했던 결과입니다. CUMSUM보다 빠르지 만 루핑보다 느립니다 ... A의 크기와 채우기 비율 (OP가 실제로 정의하지 않은)에 따라 달라 지지만 여전히 느립니다. – gnovice