将矩阵应用于函数

7

尝试使用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

the target function

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

应用常量到函数。
mapply(fun_abc, 2, constants)

我不断收到错误提示:在(函数(a,b,c)中缺少参数“c”,且没有默认值。有人能发现问题吗?

我使用的函数是我实际应用的简化版本。它不是一个线性函数,因此我更喜欢使用mapply。我还编辑了问题并在帖子上发表了评论。 - Amidavid
请在发布新问题之前澄清并/或回复评论。 - NelsonGon
3个回答

4
您可以直接乘以值并使用rowSums函数获取按行求和的结果。
vals <- c(3, 2, 3)
rowSums(t(t(constants) * vals))
#[1] 32 40 48

我们使用转置是因为常量 * 值会在每一列中将相乘,因此第一次转置是按行对进行乘法运算,而第二次转置是为了再次获得原始格式的矩阵。如果我们总是有一个方阵(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)

1

另一种可能性,虽然过于复杂:

   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。我也编辑了问题。 - Amidavid
我看不出你的问题和原始问题有什么区别。你能具体说明一下“非线性”函数应该如何更改吗? - NelsonGon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接