c++ - 如何优化 3d 复杂 <double> 数组的 'for loop' 以提高 C++ 中的速度

标签 c++ arrays matlab

这段代码中的所有数组在这段代码中都是复数类型,这个for循环的运行时间大约是1分钟。 Ktemp 是一个大小为 141*1202*141 的数组。谁能帮我优化这段代码并节省运行时间?

 complex<double> ***P1;
        P1 = new complex<double>**[141];
        for (i = 0; i < num_y; i++)
        {
            P1[i] = new complex<double> *[1202];
            for (j = 0; j < tsize; j++)
            {
                P1[i][j] = new complex<double>[141];
            }
        }

        for (int zz = 1; zz < 20; zz++)//in z direction
        {
            for (i = 0; i < 141; i++)
            {
                for (j = 0; j < 1202; j++) 
                {
                    for (k = 0; k < 141; k++)
                    {   
                        if (Ktemp[i][j][k].real() <= 0)
                        {
                            P1[i][j][k] = 0;  
                        }
                        else
                        {
                            P1[i][j][k] = excit_pfft[i][j][k] * expn[i][j][k];
                        }
                    }
                }
            }
            excit_pfft = P1;    
        }

我的第二个问题是关于用 C++ 重写 matlab 函数“fftshift”。我已经完成了代码,但似乎效率不高。谁能帮我重写这段代码?我的代码附在下面:

complex<double> ***fftw_shift(complex<double> ***te, int a, int b, int c)
{
    complex<double> ***tempa;
    tempa = new complex<double> **[a];
    for (i = 0; i < a; i++)
    {
        tempa[i] = new complex<double> *[b];
        for (j = 0; j < b; j++)
        {
            tempa[i][j] = new complex<double>[c];
        }
    }
    /*for the row*/
    if (c % 2 == 1)
    {
        for (i = 0; i < a; i++)
        {
            for (j = 0; j < b; j++)
            {
                for (k = 0; k < c / 2; k++)
                {
                    tempa[i][j][k] = te[i][j][k + c / 2 + 1];
                    tempa[i][j][k + c / 2] = te[i][j][k];
                    tempa[i][j][c - 1] = te[i][j][c / 2];
                }
            }
        }
    }
    else
    {
        for (i = 0; i < a; i++)
        {
            for (j = 0; j < b; j++)
            {
                for (k = 0; k < c / 2; k++)
                {
                    tempa[i][j][k] = te[i][j][k + c / 2];
                    tempa[i][j][k + c / 2] = te[i][j][k];
                }
            }
        }
    }


    for (i = 0; i < a; i++)
    {
        for (j = 0; j < b; j++)
        {
            for (k = 0; k < c; k++)
            {
                te[i][j][k] = tempa[i][j][k];
            }
        }
    }


    /*for the column*/
    if (b % 2 == 1)
    {
        for (i = 0; i < a; i++)
        {
            for (j = 0; j < b / 2; j++)
            {
                for (k = 0; k < c; k++)
                {
                    tempa[i][j][k] = te[i][j + b / 2 + 1][k];
                    tempa[i][j + b / 2][k] = te[i][j][k];
                    tempa[i][b - 1][k] = te[i][b / 2][k];
                }
            }
        }
    }
    else
    {
        for (i = 0; i < a; i++)
        {
            for (j = 0; j < b / 2; j++)
            {
                for (k = 0; k < c; k++)
                {
                    tempa[i][j][k] = te[i][j + b / 2][k];
                    tempa[i][j + b / 2][k] = te[i][j][k];
                }
            }
        }
    }

    for (i = 0; i < a; i++)
    {
        for (j = 0; j < b; j++)
        {
            for (k = 0; k < c; k++)
            {
                te[i][j][k] = tempa[i][j][k];
            }
        }
    }

    /*for the third dimension*/
    if (a % 2 == 1)
    {

        for (i = 0; i < a / 2; i++)
        {
            for (j = 0; j < b; j++)
            {
                for (k = 0; k < c; k++)
                {
                    tempa[i][j][k] = te[i + a / 2 + 1][j][k];
                    tempa[i + a / 2][j][k] = te[i][j][k];
                    tempa[a - 1][j][k] = te[a / 2][j][k];
                }
            }
        }
    }
    else
    {
        for (i = 0; i < a / 2; i++)
        {
            for (j = 0; j < b; j++)
            {
                for (k = 0; k < c; k++)
                {
                    tempa[i][j][k] = te[i + a / 2][j][k];
                    tempa[i + a / 2][j][k] = te[i][j][k];

                }
            }
        }
    }

    for (i = 0; i < a; i++)
    {
        for (j = 0; j < b; j++)
        {
            for (k = 0; k < c; k++)
            {
                te[i][j][k] = tempa[i][j][k];
            }
        }
    }

    return (te);
}

最佳答案

由于您重复乘以 expn 中的值(即计算指数),您可以使用 pow 函数更有效地执行此操作并摆脱 zz 循环:

for (i = 0; i < 141; i++)
{
    for (j = 0; j < 1202; j++) 
    {
        for (k = 0; k < 141; k++)
        {   
            if (Ktemp[i][j][k].real() <= 0)
            {
                excit_pfft[i][j][k] = 0;  
            }
            else
            {
                excit_pfft[i][j][k] = excit_pfft[i][j][k] * pow(expn[i][j][k], 20);
            }
        }
    }
}

您的代码似乎也有内存泄漏,因为您将 P1 分配给 excit_pfft,但从未释放 excit_pfft 的先前内容。一旦摆脱了外部循环,在任何情况下都不需要 P1 临时数组。

我不确定复数 pow() 函数的内部结构,但您可以通过将复数转换为极坐标(角度 + 距离标量)然后乘以几何计算复数的(标量)指数通过功率的角度并增加到功率的距离,然后转换回来。所以它比重复乘法快得多。

关于c++ - 如何优化 3d 复杂 <double> 数组的 'for loop' 以提高 C++ 中的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31576913/

相关文章:

c++ - 如何从文件中读取不同大小的位值?

c++ - 如何快速比较 C++ 中的可变长度位串?

Java程序跳过for循环

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

python - 通过 scipy.io.loadmat 将 matlab 3D 矩阵传输到 python 3D 数组会出错

C++与Matlab结合

c++ - 如何使用多线程处理缓存数据结构(例如 openmp)

c++ - Visual Studio 2013 : Redirecting console output to Visual Studio Output Window

php - 拉拉维尔 : get data array and loop with For

ios - Swift 过滤字符串数组