如何通过嵌套循环获取3D矩阵元素在记录集中的对应索引?
问题:获取3D矩阵元素在记录集中的索引
我有一个包含4条记录的文本文件,每条记录由4个数值组成;同时有一个3D矩阵res,该矩阵中的每个元素都是文本文件中的某条记录。需要遍历这个3D矩阵,获取每个元素在文本文件记录集中的索引。
数据示例
float res[4][3][4] = { {{1.1, 2.2, 3.3, 4.4}, {4.4, 5.5, 6.6, 7.7}, {7.7, 8.8, 9.9, 0.0}}, {{4.4, 5.5, 6.6, 7.7}, {1.1, 2.2, 3.3, 4.4}, {7.7, 8.8, 9.9, 0.0}}, {{7.7, 8.8, 9.9, 0.0}, {1.1, 2.2, 3.3, 4.4}, {4.4, 5.5, 6.6, 7.7}}, {{1.1, 2.2, 3.3, 4.4},{5.5, 1.1, 4.4, 6.6}, {4.4, 5.5, 6.6, 7.7}} }; float records[4][4] = { {7.7, 8.8, 9.9, 0.0}, {1.1, 2.2, 3.3, 4.4}, {4.4, 5.5, 6.6, 7.7}, {5.5, 1.1, 4.4, 6.6} };
期望输出
results[4][3]= { {2, 3, 1}, {3, 2, 1}, {1, 2, 3}, {2, 4, 3} }
当前实现代码
int *rowIndices = (int *)malloc(4 * sizeof(int)); for (int i = 0; i < 4; i++) { int rowIndex = -1; // Initialize to -1 if no matching row is found printf("Results for record %d:\n", i + 1); for (int j = 0; j < 3; j++) { int match = 1; // Assume a match printf("Residue %d: ", j + 1); for (int k = 0; k < 4; k++) { printf("res %f: ", res[i][j][k]); printf("record %f: ", records[j][k]); if (res[i][j][k] != records[j][k]) { match = 0; // Not a match break; } } if (match) { printf("%d ", j); rowIndices[i] = j; } printf("\n"); } printf("Row index for res[%d]: %d\n", i, rowIndices[i]); }
代码问题分析
现有代码的核心问题是:对于每个res[i][j]元素,仅尝试与records[j]这条记录比对,一旦某个数值不匹配就直接跳出循环,没有遍历所有4条记录去寻找匹配项,因此无法找到每个res元素对应的正确记录索引。
修正后的代码
#include <math.h> // 初始化结果矩阵,大小4x3 int results[4][3]; // 遍历3D矩阵的每个元素 for (int i = 0; i < 4; i++) { for (int j = 0; j < 3; j++) { // 默认无匹配,索引设为-1 results[i][j] = -1; // 遍历所有记录,寻找匹配项 for (int r = 0; r < 4; r++) { int match = 1; // 比对当前res元素和第r条记录的所有4个数值 for (int k = 0; k < 4; k++) { // 用误差范围判断浮点数是否相等,避免精度问题 if (fabs(res[i][j][k] - records[r][k]) > 1e-6) { match = 0; break; } } if (match) { // 期望输出的索引从1开始,所以取r+1 results[i][j] = r + 1; // 找到匹配后跳出记录循环 break; } } } } // 打印结果 printf("results[4][3]= {\n"); for (int i = 0; i < 4; i++) { printf(" {"); for (int j = 0; j < 3; j++) { printf("%d", results[i][j]); if (j < 2) printf(", "); } printf("},\n"); } printf("}\n");
关键说明
- 新增记录遍历循环:对每个
res[i][j]元素,遍历所有4条记录逐一比对,确保找到正确匹配项。 - 处理浮点数精度:避免直接用
==比较浮点数,改用fabs(a-b) < 1e-6的误差范围判断,防止精度误差导致匹配失败。 - 索引格式对齐:结果索引从1开始,与期望输出的格式一致。
内容的提问来源于stack exchange,提问作者moonlight
相关产品推荐
相关产品推荐

