Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用矩阵每行中的元素应用函数_R_Function_Matrix_Apply - Fatal编程技术网

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

R 使用矩阵每行中的元素应用函数,r,function,matrix,apply,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

我正在为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”的想法都是非常受欢迎的。(我不受应用程序包的限制)

apply(A,1,FUN=function(x){
y
apply(A,1,FUN=函数(x){

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

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))

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

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))

不确定这是否有帮助:

 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

fun1不确定这是否有帮助:

 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

fun1如果包含
for
循环,则可能更容易找到使用
apply
重写的方法。我扩展了结果如果包含
for
循环,则可能更容易找到如何使用
apply
重写的方法。我扩展了结果