Большинство советов, которые вы читаете, включая сообщение в блоге от Loren, скорее всего относится к старым версиям MATLAB, для которых bsxfun
было довольно быстро, чем repmat
. В R2013b (см. Раздел «Производительность» в ссылке) repmat
был переопределен, чтобы обеспечить большие улучшения производительности при применении к числовым, символьным и логическим аргументам. В последних версиях он может быть примерно такой же скорости, как bsxfun
.
Для чего это стоит, на моей машине с R2014a я
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.03756
ans =
0.034831
так выглядит bsxfun
еще чуть-чуть быстрее, но не так много - и на вашей машине, кажется, обратный случай , Конечно, эти результаты, вероятно, будут снова меняться, если вы измените размер A
или операцию, которую вы применяете.
Могут быть другие причины, чтобы предпочесть одно решение над другим, например, элегантность (я предпочитаю bsxfun
, если это возможно).
Edit: комментаторам попросили по определенной причине предпочитать bsxfun
, подразумевая, что он может использовать меньше памяти, чем repmat
, избегая временную копию, что repmat
не делает.
Я не думаю, что это на самом деле так. Например, откройте Диспетчер задач (или эквивалент на Linux/Mac), смотреть уровни памяти и тип:
>> m = 1e5; n = 8e3; A = rand(m,n);
>> B = A - repmat(mean(A),size(A,1),1);
>> clear B
>> C = bsxfun(@minus,A,mean(A));
>> clear C
(Adjust m
и n
до скачки не видно на графике, но не настолько велик, вам заканчивается память).
я вижу точно такое же поведение со стороны как repmat
и bsxfun
, которая является то, что память плавно повышается на новый уровень (в основном двойной размер A
), без временного дополнительного пика.
Это также случай, даже если операция выполняется на месте.Опять же, следить за память и тип:
>> m = 1e5; n = 8e3; A = rand(m,n);
>> A = A - repmat(mean(A),size(A,1),1);
>> clear all
>> m = 1e5; n = 8e3; A = rand(m,n);
>> A = bsxfun(@minus,A,mean(A));
Опять же, я вижу, точно такое же поведение со стороны как repmat
и bsxfun
, которая является то, что память достигает пика (в основном двойной размер A
), а затем падает обратно на предыдущий уровень.
Так что, боюсь, я не вижу много технических различий с точки зрения скорости или памяти между repmat
и bsxfun
. Мое предпочтение для bsxfun
действительно просто личное предпочтение, поскольку оно кажется немного более элегантным.
Для меня подход bsxfun всегда быстрее, а также для больших массивов. (Matlab 2014a) – thewaywewalk
Для меня (R2014b) выигрывает bsxfun. Какую версию Matlab вы используете? –
Я пробовал это как на 2014a, так и на 2014b. Может ли использование ОС сделать разницу? Я на OSX. – user1337