如何使用循环填充不同尺寸数组内容及Y_train填充异常问题排查
问题根因
你代码里的逻辑错误直接导致Y_train赋值异常,核心问题有3个:
- case1分支中,你把Y数组的赋值放在了内层j循环里,同一个行i对应的Y值会被重复赋值20次,且行计数器
nTrain、nTest从未递增,所有Y值都被写到了下标0的位置,其余位置自然保持初始零值。 - 列计数器
nTrain1、nTest1每遍历完一行的20个元素后没有重置为0,遍历完第一行后计数器就变成20,后续访问直接数组越界,属于未定义行为,X_train看起来正常只是巧合。 - 第二个分支里测试集赋值直接用i作为X_test、Y_test的下标,而这两个数组的最大下标只有1085,直接越界写内存,也会导致Y值异常。
修复后代码
void split(int fold, int array_X_set[5430][20], int array_Y_set[5430], int X_train[4344][20], int Y_train[4344], int X_test[1086][20], int Y_test[1086]) { int rows = 5430; int cols = 20; int division = 1086; int nTest = 0, nTrain = 0; switch (fold) { case 1: for (int i = 0; i < rows; ++i) { if (i < division) { // 先复制整行X for (int j = 0; j < cols; ++j) { X_test[nTest][j] = array_X_set[i][j]; } // 再赋值对应Y,行计数器自增 Y_test[nTest] = array_Y_set[i]; nTest++; } else { for (int j = 0; j < cols; ++j) { X_train[nTrain][j] = array_X_set[i][j]; } Y_train[nTrain] = array_Y_set[i]; nTrain++; } } break; // 其余fold分支参考该逻辑修改即可,比如测试集为1086~2171的分支: case 2: nTest = 0; nTrain = 0; for (int i = 0; i < rows; ++i) { if (i >= 1086 && i <= 2171) { for (int j = 0; j < cols; ++j) { X_test[nTest][j] = array_X_set[i][j]; } Y_test[nTest] = array_Y_set[i]; nTest++; } else { for (int j = 0; j < cols; ++j) { X_train[nTrain][j] = array_X_set[i][j]; } Y_train[nTrain] = array_Y_set[i]; nTrain++; } } break; default: break; } }
内容的提问来源于stack exchange,提问作者user555
相关产品推荐
相关产品推荐

