使用线性代数而不是逐个元素操作是否有优势?

时间:2014-06-17 18:49:37

标签: matlab octave

例如,在回归问题中,您可能希望将包含数据的两个向量之间差异的平方相加。如果我们有以下几种方法,我可以这样做:

    x = [3 4 5 6];
    y = [2 4 6 3];

我可以写:

    sum((x-y).^2)

或:

    (x-y)*(x-y)'

这两个都返回相同的值,11。这只是一个可以用任何一种方式进行计算的例子,但我想知道是否有理由选择这种或那种方式,如果有不同的话适合选择一种方式而不是另一种方式的任务类型。

2 个答案:

答案 0 :(得分:1)

第一个变体可以扩展为一次处理多组输入数据:

x = [3 4 5 6;1 2 3 4];
y = [2 4 6 3;4 3 2 1];
sum((x-y).^2,2)

特别是在处理许多小型数据时,这可能是一个显着的加速。对于许多函数(例如sum),您可以看到函数内置函数具有dim参数,该参数允许选择应在其上执行操作的维度。这是一种更通用的方法,可以提高可重用性。在这种情况下,允许选择维度是微不足道的

yourfun(x,y,dim)=sum((x-y).^2,dim)

答案 1 :(得分:0)

那么Matlab中sum(x.^2)向量的x*x'1xN之间有什么区别?

令人惊讶的是有一个。在乘法情况下,执行速度快了五倍。

x = rand(1, 1e6);

tic;
for i = 1:1e2
    x * x';
end;
toc;

tic;
for i = 1:1e2
    sum(x.^2);
end;
toc;

在2012b上给出:

Elapsed time is 0.057315 seconds.
Elapsed time is 0.289310 seconds.