3D矩阵不会“更新”值-C

时间:2020-05-28 10:17:55

标签: c matrix sqrt

我正在尝试优化for循环,该循环可以计算1 / sqrt(x),其中x是3D矩阵中的值。


    for(int i=0;i<=DIM1/2;i++)
            for (int j = 0; j <= DIM2/2; j++)
                for (int k = 0; k <= DIM3/2; k++)
                {
                    out[i][j][k] = isqrt(in[i][j][k], 1, 0.001);
                    out[DIM1-i-1][DIM2 - j-1][DIM3 - k-1] = isqrt(in[DIM1 - i-1][DIM2 - j-1][DIM3 - k-1], 1, 0.001);
                }

我试图计算同一循环中的第一个元素和最后一个元素,以便将for周期分成两半,我不知道推理的路线是否正确,但是无论如何,当我运行代码时返回的值第二条指令是正确的,但是调试时我无法在矩阵中看到它。 如果我尝试 printf(" %f \n", out[DIM1 - i - 1][DIM2 - j - 1][DIM3 - k - 1]); 该值是正确的,但在调试中未出现在矩阵中,最后我尝试打印所有out数组,但是有零。

这是功能

float isqrt(float x, float y0, float epsilon) {
    float yKNext = 1.5 * y0 - 0.5 * x * y0 * y0 * y0; 
    while ((yKNext - y0) > epsilon) {
        y0 = yKNext;
        yKNext = 1.5 * y0 - 0.5 * x * y0 * y0 * y0;
    }
    return yKNext;
}

我试图听从您的建议:

float isqrt(float x, float y0, float epsilon) { 
   //x= x *0.5f;
    //float yKNext = y0 * (1.5f - x * y0 * y0);   
    double newx = 0.5 * x;
    double yK = y0;
    double yKNext = 1.5 - newx; //y0=1, i dont need to multiply
    while ((yKNext-yK) > 0.00221684015)
    {
        yK = yKNext;
        yKNext = yK * (1.5 - newx * yK * yK);
    }
    return yKNext;
}

void compute(float in[DIM1][DIM2][DIM3], float out[DIM1][DIM2][DIM3]) {
    int i=0, j=0, k=0;
    for ( i = 0; i < DIM1; i++)
        for ( j = 0; j < DIM2; j++)            
            for ( k = 0; k <  DIM3; k++)
            {
                out[i][j][k] = isqrt(in[i][j][k], 1, 0.00221684015);
                //printf("%f  %f\n", out[i][j][k], 1 / sqrt(in[i][j][k]));
            }

}

fabs会使代码变慢,并且,如果我没有记错的话,yKNext总是大于yK。 我不能修改函数原型,这是练习的准则之一,因此我不能删除未使用的参数,但使用固定值可使代码更快,这是教授唯一考虑的事情。

0 个答案:

没有答案