【问题标题】:Applying a matrix to a function [duplicate]将矩阵应用于函数[重复]
【发布时间】:2020-01-16 13:58:27
【问题描述】:

尝试将矩阵应用于函数,使用mapply没有成功

我正在尝试求解一组不同参数的方程。在一组函数的更简单的形式中,我试图将一个函数传递给一个矩阵 - 常量 -

     a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9

并尝试求解方程3*a + 2*b + 3*c 并返回矩阵中每一行的答案。我已将原始函数更改为线性且更简单的函数 - 这就是为什么我更喜欢使用 #mapply 并且以前的解释对我没有帮助。

构建矩阵

my_vector <- 1:9
constants <- matrix(my_vector, 3, 3)
colnames(constants) <- c("a", "b", "c")
constants

目标函数

fun_abc <- function(a, b, c){
  return(3 * a + 2 * b + 3 * c)
}

将常量应用于函数

mapply(fun_abc, 2, constants)

我不断收到错误(函数(a,b,c):参数“c”丢失,没有默认值 谁能发现问题?

【问题讨论】:

  • 我使用的函数是我实际应用的函数的简化版本。因此,它不是线性函数 - 我更喜欢使用 mapply。我也编辑了这个问题。我评论了帖子并编辑了原始问题
  • 请在发布新问题之前澄清和/或回复 cmets。

标签: r function matrix


【解决方案1】:

您可以直接将值相乘并取rowSums 得到逐行求和

vals <- c(3, 2, 3)
rowSums(t(t(constants) * vals))
#[1] 32 40 48

我们使用转置,因为constants * vals 会在每一列中乘以vals,所以第一个转置是逐行相乘vals,第二个转置是再次得到原始格式的矩阵。如果我们总是有一个方阵 (nrow == ncol),我们可以减少一个转置并改用colSums 来获得相同的值。

colSums(t(constants) * vals)
#[1] 32 40 48

如果我们想避免转置,我们也可以使用sweep

rowSums(sweep(constants, 2, vals, `*`))

【讨论】:

    【解决方案2】:

    一种使用矩阵乘法的简单方法,然后根据需要将其更改为向量:

    my_vector <- 1:9
    constants <- matrix(my_vector, 3, 3)
    colnames(constants) <- c("a", "b", "c")
    vals <- c(3, 2, 3)
    
    c(constants %*% vals)
    #> [1] 32 40 48
    

    或者,重新定义你的函数并使用apply

    fun_x <- function(x){
      sum(x * vals) # same as 3 * x[1] + 2 * x[2] + 3 * x[3]
    }
    
    apply(constants, 1, fun_x)
    

    【讨论】:

      【解决方案3】:

      另一种虽然公认过于复杂的可能性:

         fun_abc <- function(my_matrix,multiplier,...){
       columns <- match(c(...),colnames(my_matrix))
       rowSums(mapply(function(x, y) my_matrix[,x] * y  , 
                      columns, multiplier))
      
       }
       fun_abc(constants, c(3,2, 3),"a", "b", "c")
      [1] 32 40 48
      

      这假定用户希望以编程方式访问列,否则:

      constants[,"a"] * 3 + constants[,"b"] * 2 + constants[,"c"] * 3
      [1] 32 40 48
      

      【讨论】:

      • 我使用的函数是我实际应用的函数的简化版本。因此,它不是线性函数 - 我更喜欢使用 mapply。我也编辑了问题。
      • 我看不出你的问题和原来的问题有什么区别。您能否实际包含“非线性”函数应更改为的内容?
      猜你喜欢
      • 2017-11-07
      • 2012-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 1970-01-01
      • 2023-03-14
      相关资源
      最近更新 更多