如何从矩阵的每一行中减去一个向量?

Mie*_*ter 26 matlab vector matrix subtraction

可能重复:
如何将矩阵的每一行除以固定行?

我正在寻找一种优雅的方法来从矩阵的每一行中减去相同的向量.这是一种非常优雅的方式.

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);
Run Code Online (Sandbox Code Playgroud)

而且,优雅的方式不能比这种方法慢.

我试过了

c = b-repmat(a,size(b,1),1); 
Run Code Online (Sandbox Code Playgroud)

而且似乎更慢.

编辑:获胜者是这种方法.

c(:,1) = b(:,1) - a(1);
c(:,2) = b(:,2) - a(2);
c(:,3) = b(:,3) - a(3);
Run Code Online (Sandbox Code Playgroud)

编辑:更多方法和tic toc结果:

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
Run Code Online (Sandbox Code Playgroud)

结果

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.
Run Code Online (Sandbox Code Playgroud)

Mud*_*hud 6

这是我的贡献:

c = b - ones(size(b))*diag(a)

现在加速测试它:

tic
for i = 1:10000
    c = zeros(size(b));
    b = rand(7,3);
    c = b - ones(size(b))*diag(a);
end
toc
Run Code Online (Sandbox Code Playgroud)

结果:

Elapsed time is 0.099979 seconds.

不是那么快,但很干净.


asc*_*ler 1

只有三个明显的答案,而你在问题中给出了其中两个。

第三个是按行,

c(1,:) = b(1,:) - a; %...
Run Code Online (Sandbox Code Playgroud)

但我预计这会比大型矩阵的按列处理慢,因为它访问的元素不符合内存顺序。

如果将按列处理变成for*.m 文件或子函数中的循环,它是否仍然比该repmat版本更快?

您可以测试速度的另一件事是:尝试预分配c

c = zeros(size(b));
c(:,1) = b(:,1) - a(1); %...
Run Code Online (Sandbox Code Playgroud)