首页 > 解决方案 > 如何在 R 中的父函数中编写两个或多个具有不同大小写的子函数

问题描述

我想编写一个函数来计算方阵的行列式是一个2x23x3一个函数,这样如果它的用户只提供 4 个元素,它将把它变成 2x2,如果它的用户提供 9 个元素,它将使用 3x3功能。这是我对 2x2 和 3x3 的功能:

matrix(1:4, ncol=2)
#     [,1] [,2]
#[1,]    1    3
#[2,]    2    4
A_22 <- function(x11, x12, x21, x22) {
  (x11 * x22) - (x12 * x21)
}
A_22(x11 = 1, x12 = 2, x21 =3, x22 = 4)
#[1] -2
cbind(1,1:3,c(2,0,1))
#     [,1] [,2] [,3]
#[1,]    1    1    2
#[2,]    1    2    0
#[3,]    1    3    1

A_33 <- function(x11, x12, x13, x21, x22, x23, x31, x32, x33) {
  (x11 * x22 * x33) + (x12 * x23 * x31) + (x13 * x21 * x33) - (x31 * x22 * x13) - (x32 * x23 * x11) - (x33 * x21 * x12)
}
A_33(x11 = 1, x12 = 1, x13 = 2, x21 = 1, x22 = 2, x23 = 0, x31 = 1, x32 = 3, x33 = 1)
#[1] -1

我查看了这个解决方案,但它仅适用于使用不同的方法来解决问题,而不是处理不同案例的问题。

将 和 的两种不同情况结合到父函数的优雅方式是A_22什么A_33

标签: rfunction

解决方案


请检查这是否解决了您的问题:

Det_fn <- function(x){
if(nrow(x)!=ncol(x)) {
  print("Undefined")
} else
  if(nrow(x)==1 && ncol(x)==1) {
    DET <- x[1,1]; DET
  } else
    if(nrow(x)==2 && ncol(x)==2) {
      DET <- x[1,1]*x[2,2]-x[1,2]*x[2,1]; DET
    } else
      for(j in 1:ncol(x)){
        DET[j] <- (((-1)^(1+j))*x[1,j]*Det_fn(x[-1,-j]))
      }
  DET
  sum(DET)
}

如果我理解正确,您想以某种递归方式在函数内部调用相同的函数:矩阵计算的行列式示例是最相关的,因为它涉及嵌套for循环并在同一个函数内调用行列式函数。我已经更新了函数来纠正一些错误,现在我可以计算这个,例如:

x <- matrix(1:16, ncol=4); x

在函数中,如果列数和行数不同,则函数返回一条消息,指示行列式未定义。如果矩阵中有单个元素,则行列式是该元素的值。接下来显示 2X2 情况的行列式。当矩阵大于 2X2 时,它使用递归计算行列式...请尝试一下,如果这能解决问题,请告诉我。


推荐阅读