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

标签 matlab vector matrix subtraction

<分区>

Possible Duplicate:
How can I divide each row of a matrix by a fixed row?

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

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);

编辑:更多方法和 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

结果

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.

最佳答案

这是我的贡献:

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

结果:

耗时是 0.099979 秒。

不是那么快,但很干净。

关于matlab - 如何从矩阵的每一行中减去一个向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5342857/

相关文章:

python - 当移动物体偏离路径特定幅度时如何发出警告?

c - CUDA矩阵乘法的性能

java - 是否有一个函数可以对两个缓冲图像的光栅求和?

matlab - bwconncomp 的第 N 大组件,包括背景

matlab - 在 Matlab 中转发输入名称?

c++ vector不分配连续内存

通过引用获取操作数的 c# 乘法运算符

matlab - 使用 MATLAB Function 模块进行几何变换

MATLAB - 防止简化方程

c++ - vector 大小在 for 循环中填充后返回 0