You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过嵌套循环获取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");

关键说明

  1. 新增记录遍历循环:对每个res[i][j]元素,遍历所有4条记录逐一比对,确保找到正确匹配项。
  2. 处理浮点数精度:避免直接用==比较浮点数,改用fabs(a-b) < 1e-6的误差范围判断,防止精度误差导致匹配失败。
  3. 索引格式对齐:结果索引从1开始,与期望输出的格式一致。

内容的提问来源于stack exchange,提问作者moonlight

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:07:33