matlab - 在 Matlab 中重复向量的最有效方法

标签 matlab vector vectorization

重复向量的最有效方法是什么?

我目前的印象是 repmat 优于任何其他方法?还是我的这种心态大错特错了?

是否可以使用不同的技术产生与 repmat 完全相同的结果?也许是普通的矩阵乘法?

非常感谢您的关注和支持!

AER

最佳答案

底线,bsxfun如果起始向量很长或重复次数足够大(见下文),则比您要求的两个更快,否则矩阵乘法效率更高。在您询问的两者之间,矩阵乘法+ reshape 在效率上比 repmat 高出约 3 倍。我用过 timeit通过以下方式,我创建了一个包含 1e5 个元素的随机向量,并检查了创建 100 次重复需要多长时间:

v=rand(1e5,1);
f1=@()repmat(v,[100,1])
f2=@() reshape(v*ones(1,100),[],1);

timeit(f1)
ans =
     0.1675

timeit(f2)
ans =
    0.0516

然而 bsxfun 甚至更快:

f3=@() reshape(bsxfun(@times,v,ones(1,100)),[],1) 

timeit(f3)

 ans =
     0.0374

下面是对这一观察的更仔细的研究:

给定一个向量有 1000 个元素长,将其重复 10 到 1e5 次会产生以下性能时间:

enter image description here

对于较小的重复次数,bsxfun 和矩阵乘法之间几乎没有区别,但随着重复次数超过 ~1e3,bsxfun 明显获胜。

但是,仅采用具有相同重复范围的 10 个元素长向量,表明矩阵乘法效率更高。 bsxfun 只有在 10^5 次重复后才开始变得更好,但即便如此它也只快了 ~5%(未显示):

enter image description here

所以这真的取决于你追求什么。更多讨论参见 Loren on the Art of MATLAB blog .

关于matlab - 在 Matlab 中重复向量的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16746999/

相关文章:

matlab - 如何在Matlab中存储函数fminunc的迭代次数?

matlab - 如何从 Matlab 中的 n*1 结构的特定字段中提取所有值

尝试插入 map 时出现 C++ 编译问题

R: 向量化 deparse(substitute(x))

matlab - 如何获得函数内的语句以随机选择的顺序执行?

matlab - 如何在 MATLAB 图形窗口的边缘周围创建边框?

c++ - 带 lambda 谓词的 std::remove_if

c++ - 如何为 std::array 中的 std::vectors 保留内存?

r - 获取向量中缺失值的运行长度

c++ - 自动矢量化感兴趣区域(裁剪)