Возможный дубликат:
Как я могу разделить каждую строку матрицы на фиксированную строку?I ' m ищет элегантный способ вычесть один и тот же вектор из каждой строки матрицы. Вот не элегантный способ сделать это.
a = [1 2 3]; b = rand(7,3); c(:,1) = b(:,1) - a(1); c(:,2) = b(:,2) - a(2); c(:,3) = b(:,3) - a(3);
Кроме того, элегантный способ не может быть медленнее, чем этот метод.
Я пробовал
c = b-repmat(a,size(b,1),1);
, и он кажется медленнее.
РЕДАКТИРОВАТЬ: Победитель этот метод.
c(:,1) = b(:,1) - a(1); c(:,2) = b(:,2) - a(2); c(:,3) = b(:,3) - a(3);
РЕДАКТИРОВАТЬ: Дополнительные методы и результаты тик-тока:
n = 1e6; m = 3; iter = 100; a = rand(1,m); b = rand(n,m); tic c = zeros(size(b)); for i = 1:iter c(:,1) = b(:,1) - a(1); c(:,2) = b(:,2) - a(2); c(:,3) = b(:,3) - a(3); end toc tic c = zeros(size(b)); for i = 1:iter c(:,1) = b(:,1) - a(1); c(:,2) = b(:,2) - a(2); c(:,3) = b(:,3) - a(3); end toc tic c = zeros(size(b)); for i = 1:iter for j = 1:3 c(:,j) = b(:,j) - a(j); end end toc tic for i = 1:iter c = b-repmat(a,size(b,1),1); end toc tic for i = 1:iter c = bsxfun(@minus,b,a); end toc tic c = zeros(size(b)); for i = 1:iter for j = 1:size(b,1) c(j,:) = b(j,:) - a; end end toc
результаты
Elapsed time is 0.622730 seconds. Elapsed time is 0.627321 seconds. Elapsed time is 0.713384 seconds. Elapsed time is 2.621642 seconds. Elapsed time is 1.323490 seconds. Elapsed time is 17.269901 seconds.