c - 3D 矩阵不会“更新”值 - C
问题描述
我正在尝试优化一个计算 1/sqrt(x) 的 for 循环,其中 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]);
该值是正确的,但在调试中不存在于矩阵中,最后我尝试打印所有输出数组但有零。
这是功能
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
. 我不能修改函数原型,这是练习的指导方针之一,所以我不能删除未使用的参数,但使用固定值会使代码更快,这是教授唯一考虑的事情。
解决方案
推荐阅读
- python - Pandas 读取包含 \t 的文件地址的 CSV
- reactjs - 将 Typescript 与 Material-UI useStyles 一起使用时将道具传递给类
- sql-server - 由于常量 varchar 列,架构绑定视图索引创建失败
- authentication - 使用随机字符串作为令牌而不是 JWT 进行身份验证
- email - 如何将 CNAME 记录添加到 Google 域?
- vue.js - vue.js 中有哪些替代方法可以将数据传递给除 props 之外的子组件
- javascript - 在 Deno 程序 API 上创建的 .deno_plugins 文件夹
- vue.js - 列出来自转换的一系列消息
- linux - 如何通过终端杀死bash中的进程
- reactjs - 在同一事件处理程序中更新多个 React 状态