Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何优化a';对于循环';对于3d复合体<;双倍>;数组以提高C+中的速度+;_C++_Arrays_Matlab - Fatal编程技术网

C++ 如何优化a';对于循环';对于3d复合体<;双倍>;数组以提高C+中的速度+;

C++ 如何优化a';对于循环';对于3d复合体<;双倍>;数组以提高C+中的速度+;,c++,arrays,matlab,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

此代码中的所有数组在此代码中都是复杂类型,此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;    
        }
complex***P1;
P1=新复合体**[141];
对于(i=0;i
complex<double> P1[141][1202][141];
复合体P1[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];
    }
}
complex***P1;
P1=新复合体**[141];
对于(i=0;i
因为我不知道这到底是什么,我假设:

    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;    
    }
(intzz=1;zz<20;zz++)的
for//在z方向
{
对于(i=0;i<141;i++)
{
对于(j=0;j<1202;j++)
{
对于(k=0;k<141;k++)
{   

如果(Ktemp[i][j][k].real()由于重复乘以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);
            }
        }
    }
}
(i=0;i<141;i++)的

{
对于(j=0;j<1202;j++)
{
对于(k=0;k<141;k++)
{   

if(Ktemp[i][j][k].real()对于初学者来说,您可能应该尝试使用一个
std::vector
来保存所有的
复杂的
es,现在您有170000个分配,并且您可能正在遭受大量缓存未命中的痛苦。在您的第一个代码块中,
zz
循环的作用是什么?它不做任何事情,只是让您遍历所有内容ng 20次。对于zz回路:激子pfft=P1@user657267向量可以包含复数元素?而且,我认为向量的效率不如数组。无论如何,我要试试now@gugabrielle您使用的是什么处理器/编译器?您有权访问“英特尔矢量化”吗?通过添加这些扩展,您可以获得巨大的性能提升当使用for循环时。这将是对上述建议的补充。嗯……在堆栈上分配~400MB?你会过得不好。
complex P1[141][1202][141]
我怀疑您的堆栈是否有这么大的空间。您是对的,我没有考虑大小…我将编辑答案以使用向量来代替。@AymarFisherman在下面的代码中,将出现错误:下标超出范围…int num_y=141;intt_cyc=1202;intnum_x=141;向量P1;P1.保留(num_y);for(i=0;i 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] = P1[i][j][k] * expn[i][j][k]; } } } } }
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);
            }
        }
    }
}