假设我有两个向量:
A = [1 2 3];
B = [10;20;30];
它们也可以是两个线向量 - 没关系,我会选择最好的。我现在想通过将 B 与 A 的每个元素相乘来创建线向量:
C = [1*10;1*20;1*30;2*20;2*20;2*30;3*10;3*20;3*30];
通过使用张量积 B*A
并将其 reshape 为线向量,可以轻松且高效地完成此操作。但有没有更快的方法呢?这发生在拟合函数内,因此可以传递额外的向量,例如索引数组。
最佳答案
我很惊讶还没有人想到这个:
C = bsxfun(@times, A,B);
C = C(:);
一个小比较(Win 7 64 位、MATLAB R2010a 64 位):
A = rand(1,1000);
B = rand(1000,1);
tic
D = kron(A.',B);
toc
tic
D2 = B*A;
D2 = D2(:);
toc
tic
D3 = bsxfun(@times, A,B);
D3 = D3(:);
toc
isequal(D,D2)
isequal(D,D3)
结果:
Elapsed time is 0.123301 seconds. %// kron
Elapsed time is 0.034271 seconds. %// B*A
Elapsed time is 0.010617 seconds. %// bsxfun
ans =
1
ans =
1
结果 A = rand(1,5000); B = 兰特(5000,1);
:
Elapsed time is 7.134506 seconds. %// kron
Elapsed time is 0.119705 seconds. %// B*A
Elapsed time is 0.162295 seconds. %// bsxfun
看起来 kron
底层算法的规模为 O(N²) 或更糟......
关于Matlab:复制和乘以两个向量的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21138298/