如何基于进球矩阵用循环和函数生成积分矩阵及原代码错误排查
原有代码错误原因
- 语法规则不满足:R语言中
if的判断条件必须包裹在小括号内,原代码直接写if goals1[xxx]没有加括号,属于基础语法错误,无法通过解释器检查。 - 循环逻辑冗余且错误:每场比赛对应矩阵的一行,仅需要比较同一行的两列进球数即可,完全不需要嵌套两层循环遍历列,额外的列遍历只会让逻辑混乱。
- 矩阵索引逻辑错误:原代码中
goals1[i]、points1[j]这类写法是把二维矩阵按一维向量读取/赋值,完全没有按照「行对应比赛、列对应两支球队」的逻辑索引,取值和赋值的位置全部错位。 - 判断条件逻辑完全错误:
goals1[goals1[i]>goals1[j]]的写法是尝试从矩阵中筛选满足条件的元素,而不是判断两支球队的进球大小关系,不符合需求的判断逻辑。
符合要求的points()函数实现
采用R原生向量化操作实现,无需循环,自动适配任意行数的2列进球矩阵,支持自定义胜场积分:
points <- function(goals, win_points = 3) { # 参数合法性校验 if (!is.matrix(goals) || ncol(goals) != 2) { stop("输入参数goals必须为固定2列的矩阵") } if (!is.numeric(win_points) || length(win_points) != 1 || win_points <= 0) { stop("胜场积分win_points必须为正数值") } # 初始化积分矩阵 points_mat <- matrix(0, nrow = nrow(goals), ncol = 2) # 提取主客队进球数 home_goals <- goals[, 1] away_goals <- goals[, 2] # 平局情况:两队各得1分 draw_idx <- home_goals == away_goals points_mat[draw_idx, ] <- 1 # 主队获胜情况:主队得胜场积分,客队0分 home_win_idx <- home_goals > away_goals points_mat[home_win_idx, 1] <- win_points points_mat[home_win_idx, 2] <- 0 # 客队获胜情况:客队得胜场积分,主队0分 away_win_idx <- home_goals < away_goals points_mat[away_win_idx, 2] <- win_points points_mat[away_win_idx, 1] <- 0 return(points_mat) }
测试示例
set.seed(1) # 生成5行2列的测试进球矩阵 goals1 <- matrix(sample(0:5, size = 5*2, replace = TRUE), nrow=5, ncol=2) # 调用函数,默认胜场积3分 result_default <- points(goals1) # 自定义胜场积2分 result_custom <- points(goals1, win_points = 2) # 输出结果 print("测试进球矩阵:") print(goals1) print("胜场3分对应的积分矩阵:") print(result_default)
内容的提问来源于stack exchange,提问作者Wutruvic
相关产品推荐
相关产品推荐

