Matlabを高速化するためには、forループの計算をできるだけベクトル化することが重要である。
そのために有用なMatlab関数をまとめる。

bsxfun %%%%%%%%%%%%%%%

プログラム例
A = magic(100);
tic
B = bsxfun(@minus, A, mean(A));
toc
tic
C = zeros(100);
for n = 1:100
C(n,:) = A(n,:)-mean(A);
end
toc
isequal(B,C)

出力例
経過時間は0.000171秒です
経過時間は0.005295秒です
ans = 1

reshape %%%%%%%%%%%%%%

プログラム例
A = rand(1200);
tic
B = reshape(A,25,[]);
B = sum(B);
B = reshape(B,48,[]);
B = reshape(B',25,[]);
B = sum(B);
ave_B = B./(25*25);
ave_B = reshape(ave_B,48,48);
toc

tic
for n = 1:1200./25
for m = 1:1200./25
ave_C(m,n) = mean(mean(A(25*n-24:25*n, 25*m-24:25*m)));
end
end
toc

出力例
経過時間は0.003780秒です
経過時間は0.108214秒です


accumarray %%%%%%%%%%%%%%%%%%%%%


histc %%%%%%%%%%%%%%%%%%%%%%%%%%

A = rand(100,1);
tic
N1 = histc(A,0.005:0.01:0.995);
toc
tic
N2 = zeros(100,1);
for n = 1:100
N2(n) = sum(A>=n*0.01-0.005 & Aend
toc
isequal(N1,N2)

経過時間は0.000047秒です
経過時間は0.001292秒です
ans = 1


diff %%%%%%%%%%%%%%%%%%%%

A = rand(100,1);
tic
diff1 = diff(A);
toc
tic
diff2 = zeros(99,1);
for n = 1:99
diff2(n) = A(n+1)-A(n);
end
toc
isequal(diff1,diff2)

経過時間は0.000027秒です
経過時間は0.000242秒です
ans = 1

repmat%%%%%%%%%%%%%%%%%%%%%%%


permute %%%%%%%%%%%%%%%%%%%%%%

A = rand(100,100,100);
tic
B = permute(A,[2,3,1]);
toc
tic
C = zeros(100,100,100);
for l = 1:100
for m = 1:100
for n = 1:100
C(m,n,l) = A(l,m,n);
end
end
end
toc
isequal(B,C)

経過時間は0.011770秒です
経過時間は1.910813秒です
ans = 1


sparse %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%