在R中如何编写包含多场景子函数的父函数实现矩阵行列式计算
R语言整合2x2/3x3行列式计算的单函数实现方案
核心实现代码
通过R的可变参数...捕获所有入参,自动根据参数数量匹配对应计算逻辑,同时加入非法参数校验:
calc_det <- function(...) { # 捕获所有传入参数 params <- list(...) param_len <- length(params) # 参数合法性校验 if (!param_len %in% c(4, 9)) { stop("仅支持传入4个参数(对应2x2矩阵)或9个参数(对应3x3矩阵)") } # 2x2矩阵行列式计算 if (param_len == 4) { return(params[[1]] * params[[4]] - params[[2]] * params[[3]]) } # 3x3矩阵行列式计算 return( params[[1]] * params[[5]] * params[[9]] + params[[2]] * params[[6]] * params[[7]] + params[[3]] * params[[4]] * params[[8]] - params[[7]] * params[[5]] * params[[3]] - params[[8]] * params[[6]] * params[[1]] - params[[9]] * params[[4]] * params[[2]] ) }
测试验证
和原有函数的参数顺序完全兼容,可直接替换使用:
# 测试2x2场景 calc_det(1, 2, 3, 4) # [1] -2 # 测试3x3场景 calc_det(1, 1, 2, 1, 2, 0, 1, 3, 1) # [1] -1
扩展优化(可选)
如果需要兼容直接传入矩阵对象的场景,可以扩展逻辑如下,两种调用方式可自动识别:
calc_det <- function(...) { params <- list(...) # 识别单个矩阵入参的场景 if (length(params) == 1 && is.matrix(params[[1]])) { mat <- params[[1]] if (!identical(nrow(mat), ncol(mat)) || !nrow(mat) %in% c(2, 3)) { stop("仅支持2x2或3x3的方阵输入") } # 按行展开矩阵为参数列表 params <- as.list(t(mat)) } param_len <- length(params) if (!param_len %in% c(4, 9)) { stop("仅支持传入4个参数、9个参数,或单个2x2/3x3方阵") } if (param_len == 4) { return(params[[1]] * params[[4]] - params[[2]] * params[[3]]) } return( params[[1]] * params[[5]] * params[[9]] + params[[2]] * params[[6]] * params[[7]] + params[[3]] * params[[4]] * params[[8]] - params[[7]] * params[[5]] * params[[3]] - params[[8]] * params[[6]] * params[[1]] - params[[9]] * params[[4]] * params[[2]] ) }
扩展版本测试:
# 直接传入2x2矩阵 calc_det(matrix(c(1,2,3,4), nrow = 2, byrow = TRUE)) # [1] -2 # 直接传入3x3矩阵 calc_det(cbind(1,1:3,c(2,0,1))) # [1] -1
内容的提问来源于stack exchange,提问作者Daniel James
相关产品推荐
相关产品推荐

