gpt4 book ai didi

c++ - 缩短C++中二维动态数组算法的周期

转载 作者:太空宇宙 更新时间:2023-11-04 15:28:13 26 4
gpt4 key购买 nike

我定义了二维动态数组,并为数组分配了内存。数组的维度是相同的(256*256):

    double **I1,**I2;

int M=256;
int N=256;
int i,j;

I1= new double *[M+1];
for(i=1;i<=M;i++)
{I1[i]=new double [N+1];}

I2= new double *[M+1];
for(i=1;i<=M;i++)
{I2[i]=new double [N+1];}

然后,我给数组的元素赋值。我必须在这些数组上执行数学算法。我使用了很多 for 循环。我的代码运行得非常非常慢。

例如,如果我从 I1 中减去 I2 并将减法数组分配给另一个 I3 二维数组,我使用了以下代码:

double **I3;
double temp;
//allocate I3;
I3= new double *[M+1];
for(i=1;i<=M;i++)
{I3[i]=new double [N+1];}


//I3=I1-I2


for(i=1;i<=M;i++){
for(j=1;j<=N;j++){
temp=I1[i][j]-I2[i][j];
I3[i][j]=temp;}
}

如何在不使用 for 循环的情况下缩短 C++ 的执行时间?你能告诉我其他方法吗?

最好的问候..

最佳答案

首先,在大多数情况下,我建议不要像这样手动管理内存。我相信您听说过 C++ 提供了可以应用“算法”的容器类。这些容器不太容易出错(尤其是在出现异常的情况下),操作更具表现力、更优化并且通常经过良好测试,因此被证明是可行的。

在您的情况下,在已知数组大小的情况下,可以使用 std::vector 而不会造成性能损失(创建时除外),因为内存保证是连续的,因此可以像数组一样使用。您还应该考虑展平您的数组,在循环中调用分配例程并不是很快 - 分配成本很高。在进行矩阵乘法时,考虑以行优先/列优先对进行分配,这有助于缓存……但我离题了。

不过,这只是一般性建议 - 我并不是建议您使用容器重新实现它,我只是觉得有必要提及它们。

在这种特定情况下,由于您提到要“执行数学算法”,我建议您看一下能够进行矩阵/vector 运算的数字库,因为这似乎就是您所追求的。

对于 C++,有 Newmat例如,以及(或多或少)规范的 BLAS/LAPACK 实现(即 Netlib、AMD 的 ACMLATLAS)。这些允许您更快地执行常见(和不太常见)的操作,例如添加/减去 vector 、乘法矩阵等,既使用优化算法,也使用优化作为您的处理器可能提供的 SIMD 指令(即 SSE)。

显然,在进行计算时无法避免对这些值进行迭代,但您可以通过优化的方式和标准接口(interface)进行计算。

关于c++ - 缩短C++中二维动态数组算法的周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3433684/

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