使用矩阵每行的元素应用函数

时间:2014-07-16 06:33:44

标签: r function matrix apply

我正在努力应对"申请" R中的类型函数 我有一个矩阵,我想要的是使用矩阵的每一行的元素,使用用户定义的函数根据矩阵的输入进行一些计算,并创建一个新的,将存储来自这些的结果计算。

当函数只返回一个输出

时,我已经想出了如何做到这一点

因此,例如假设矩阵A和执行某种计算的函数。

> A=matrix(1:16,nrow=4)
> A
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

> B=apply(A,1,FUN=function(x) x[1]**2+2*x[2]+x[3]*x[4])
> B
[1] 128 156 188 224

我需要的是在输出是多个元素的向量的情况下扩展它,想象例如我想要计算三个不同多项式的值而不是如示例中的一个,并再次获得4x3矩阵,包含这三个多项式的计算。

暂时我正在使用" for"逐行读取数据的循环,执行函数并将结果存储在一个新的矩阵中,但速度很慢。 一个例子是:

 A=matrix(1:16,nrow=4)
 A  
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
 calc=function(e1,e2,e3,e4){
   x1=e1*e2+3*e3*e4
   x2=e4+e2+5*e3**2-e4
   x3=e1*e2*e3*e4  
   return(c(x1,x2,x3)) 
 }

 results=matrix(nrow=4,ncol=3)

 for (i in 1:4){
   k=calc(A[i,1],A[i,2],A[i,3],A[i,4])
   results[i,]=k
 }

 results
     [,1] [,2] [,3]
[1,]  356  410  585
[2,]  432  506 1680
[3,]  516  612 3465
[4,]  608  728 6144

关于如何将类似操作应用于矩阵的任何想法,避免使用" for"非常欢迎。 (我不受限于申请套餐)

3 个答案:

答案 0 :(得分:3)

您的函数在apply框架中不起作用,因为函数应该有一个vector作为参数,而不是单个值。如果在函数中指定值,它将起作用:

calc=function(row){
  e1 = row[1]; e2 = row[2]; e3 = row[3]; e4 = row[4]
  x1=e1*e2+3*e3*e4
  x2=e4+e2+5*e3**2-e4
  x3=e1*e2*e3*e4  
  return(c(x1,x2,x3)) 
}

apply函数将返回一个完整的矩阵,但是它将以列方式创建该矩阵。因此第一行的结果将存储到第一列等中。这可以通过对结果进行转置来轻松解决。

t(apply(A, 1, calc))

答案 1 :(得分:2)

不确定这是否有帮助:

 fun1 <- function(mat){
 x1 <- mat[,1]*mat[,2]+3*mat[,3]*mat[,4]
 x2 <- mat[,4]+mat[,2]+5*mat[,3]**2-mat[,4]
 x3 <- mat[,1]*mat[,2]*mat[,3]*mat[,4]
  cbind(x1,x2,x3)
  }
 fun1(A)
#      x1  x2   x3
# [1,] 356 410  585
# [2,] 432 506 1680
# [3,] 516 612 3465
# [4,] 608 728 6144

答案 2 :(得分:0)

apply(A,1,FUN=function(x){
    y<-rep(NA,3)
    y[1]=x[1]+1
    y[2]=x[2]+x[3]
    y[3]=x[4]/2
    return(t(y))
    }
    )

这对我有用。显然,编辑y [1],y [2],y [3]的函数,如果想要超过3,还要编辑行y<-rep(NA,3)