gpt4 book ai didi

c++ - 将 matlab 转换为 c++,bsxfun

转载 作者:太空宇宙 更新时间:2023-11-03 10:46:14 25 4
gpt4 key购买 nike

我正在尝试将我的 MATLAB 代码转换为 C++,我发现在以下情况下存在问题:

MATLAB

A = rand(1000,40000);
b = rand(1000,1);
tic;
ans = bsxfun(@ne,b,A);
toc

C++

std::vector<std::vector<int> > A;
std::vector<int> b;
std::vector<int> ans(10000);

// initial A and b
const clock_t begin_time = clock();
for(int i = 0; i < 40000; ++i){
for(int j = 0; j < 1000; ++j){
if(A[i][j] != b[j])
ans[i]++;
}
}
double run_time = static_cast<double>((clock() - begin_time)) / CLOCKS_PER_SEC;

我发现 C++ 案例比 MATLAB 慢三倍。我想请问是否有人知道如何更改 C++ 代码,以便我可以获得与 bsxfun 相似或相同的性能?

在网上搜索后,我找到了两种可能的方法:

  1. 包括 Armadillo 的库
  2. 包含来自 Octave 的库

但关键是我不确定该怎么做,我的意思是我不知道实现的细节。

总结:

  1. 我想请问是否有人知道如何更改 C++ 代码,以便我可以获得与 bsxfun 相似或相同的性能?
  2. 有人可以提供一些提示或步骤或示例,以便我可以学习如何包含 Armadillo 或 Octave 来完成这项任务。

编辑:

感谢@Peter,我使用选项 -O3 进行编译,然后问题“解决”了,我的意思是速度与 MATLAB 相同。

最佳答案

1- 您以错误的顺序运行循环。在 C 和 C++ 中,二维数组按行优先存储,这意味着 A[j][i]A[j][i+1] 彼此相邻在内存中。 (这样想:A[j] 是第一个下标操作,返回对另一个 vector 的引用,然后您再次使用 [i] 下标)。

将数据保存在缓存中以进行尽可能多的操作是现代处理器性能的关键之一,这意味着您希望尽可能访问相邻元素。所以切换循环的顺序:

for(int j = 0; j < 1000; ++j){
for(int i = 0; i < 40000; ++i){

2- 编译器选项非常重要。确保您在“发布”模式下构建,或者开启优化。

3- 在 C++ 中将二维数组存储为一维数组很常见,通过乘法自行对行/列进行索引。也就是说,A 将是一个大小为 1000*40000 的 vector ,而 A[j][i] 将改为 A[j*row_length + i] 。这具有更多连续内存(参见第 1 点)、更少的动态内存分配和更好的缓存利用率的好处。

关于c++ - 将 matlab 转换为 c++,bsxfun,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21187730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com