Я пытаюсь найти самый быстрый способ стандартизации матрицы в Matlab (нулевые средние, столбцы дисперсии единиц). Все сводится к тому, что самый быстрый способ применения одной и той же операции ко всем строкам в матрице. Каждое сообщение, которое я прочитал, приходит к одному и тому же выводу: использовать bsxfun вместо repmat. Эта статья, написанная Mathworks, является примером: http://blogs.mathworks.com/loren/2008/08/04/comparing-repmat-and-bsxfun-performance/
Однако при попытке этого на моем собственном компьютере repmat всегда быстрее. Вот мои результаты, используя тот же код, что и в статье:
m = 1e5;
n = 100;
A = rand(m,n);
frepmat = @() A - repmat(mean(A),size(A,1),1);
timeit(frepmat)
fbsxfun = @() bsxfun(@minus,A,mean(A));
timeit(fbsxfun)
Результаты:
ans =
0.0349
ans =
0.0391
На самом деле, я никогда не смогу заставить bsxfun работать лучше, чем repmat в этой ситуации, независимо от того, насколько мала или велика матрица ввода.
Может кто-нибудь объяснить это?