R 使用矩阵每行中的元素应用函数
我正在为R中的“应用”类型函数而挣扎。 我有一个矩阵,我想要的是使用矩阵每一行的元素,使用用户定义的函数根据矩阵的输入进行一些计算,并创建一个新的矩阵来存储这些计算的结果 我已经了解了当函数只返回一个输出时如何执行此操作 例如,假设矩阵A和一个执行某种计算的函数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
> 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){
yapply(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
重写的方法。我扩展了结果