Matlab:复制和乘以两个向量的最快方法

标签 matlab vectorization

假设我有两个向量:

    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/

相关文章:

java - 将 .mat 文件转换为 XML —— 需要添加 java 类?

c++ - Matlab fmincons 和 C++ 的 NLP 求解器(如 ipopt)之间的性能差距是什么?

matlab - 在 MATLAB 中绘制隐式代数方程

Matlab 查询 : How to align 'title' at the botton of the figure when plotting points

c++ - 不同编程语言的getters和setters的使用

python - 根据每一行的第一个元素返回 NumPy 数组的子集

matlab - 创建水平拉伸(stretch)的上三角矩阵

python - 将掩码结果转换为不同的随机数

python - 向量化 Numpy 切片操作

matlab - 将长二维矩阵拆分为三维