【问题标题】:How Can I Write Two or More Sub-Functions with Different Cases in a Parent Function in R如何在 R 中的父函数中编写两个或多个具有不同大小写的子函数
【发布时间】:2021-12-01 21:02:42
【问题描述】:

我想编写一个函数来计算方阵的行列式是 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

我看过这个solution,但它只适用于用不同的方法解决一个问题,而不喜欢这个处理不同情况的问题。

A_22A_33 的两种不同情况组合到父函数的优雅方式是什么?

【问题讨论】:

  • stat.ethz.ch/R-manual/R-devel/library/base/html/det.html — 请注意,这会产生与您的 A_33 函数不同的结果。
  • @KonradRudolph 感谢您的建议,但我正在努力学习而不是寻找现成的解决方案。我使用行列式创建问题,只是作为案例研究来学习并能够将该方法应用于其他情况。
  • 在这种情况下,您需要转向行列式的定义,并根据对通用算法的理解创建通用函数。 ——你不能只是将两个任意函数合并为一个:它们之间没有明显的关系。不幸的是,编写一个通用的矩阵行列式函数并不是那么简单。你可以应用 Sarrus 的规则,但这需要你找到所有矩阵对角线,据我所知,R 没有内置的方法(推导它们并不难,但它 是 i> 繁琐)。
  • diagonals 结合lengths,使用@20650 方法和split 得到正向和反向对角线。尝试申请Gbemi扩展nxn,n=5,断断续续。
  • @DanielJames 请检查我的解决方案是否符合您的需求...我使用递归来解决问题并计算行列式。弄清楚如何去做很有趣......

标签: r function


【解决方案1】:

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

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 时,它使用递归来计算行列式...请尝试一下,如果这解决了问题,请告诉我。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多