2016-06-01 102 views
-2

我相乘这里创建矩阵...矩阵乘数%*%的误差

CreateMatrix <- function(frame,env){ 

    M = matrix(c(frame$EE[env],0,0,frame$Fe[env], 
       frame$EL[env],frame$LL[env],0,0, 
       0,frame$LP[env],frame$PP[env],0, 
       0,0,frame$PA[env],frame$AA[env]), 
      nrow=4,byrow=T) 
    return(M) 
} 

Models = list() 
    for (i in seq(0,16)){ 
    newModel <- CreateMatrix(Total,i) 
    Models[[i+1]] <- newModel 
} 

其中, “合计” 是一个数据帧

...递归以下功能:

GrowthSeq <- function(matrix, t,P0){ 
M0 = matrix(c(132,0,0,0),nrow=4) 
time = seq(0,t,1) 
G = matrix 
M = matrix(0,nrow=nrow(G),ncol=length(time)) 
rownames(M)=c("Eggs","Larvae","Pupae","Adults") 
M[,1]= M0 
print(is.matrix(G)) 
print(is.matrix(M)) 
for (d in 2:length(time)){ 
    print(is.matrix(t(M[,d-1]))) 
    M[,d]<-G%*%t(M[,d-1]) 
} 
return(M) 
} 

g <- GrowthSeq(Models[[1]],100,500) 

导致

[1] TRUE 
[1] TRUE 
[1] TRUE 
Error in G %*% M[, d - 1] : 
    requires numeric/complex matrix/vector argument 

我不明白这两个向量我都是矩阵,但是这个错误仍然存​​在。为什么我试图将矩阵M和G相乘无效?

+0

请注意,你的代码一般是对我们没用,因为正在创建 – Ell

回答

0

的命令:

G = matrix 

分配的matrix其值是R功能分配给符号G。这显然是而不是的矩阵。它的一个函数,当提供了正确的参数可能产生“数字/复数矩阵/向量参数”。这个错误是由%*%引发的,它测试矩阵乘法是否有意义。函数乘数字矩阵不会。

+0

尽管改变可变为“M”,而不是“矩阵”被称为“总”无数据帧,错误仍然引发 – user3179277

+0

这是不足以提供足够的上下文:什么“变量”,什么代码? –

+0

在定义函数时,矩阵是要求的第一个变量。按照您的建议,“矩阵”作为变量的名称可能对程序不明确,所以我将变量名称更改为“m”。该行现在读取'G = m',但错误仍然存​​在 – user3179277

0

在你的功能,因为你已经使用G = matrix的摹有效地成为矩阵功能,你是不是分配矩阵G,但矩阵功能G.

> M = matrix(c(0,1,1,0), nrow = 2) 
> M 
    [,1] [,2] 
[1,] 0 1 
[2,] 1 0 
> G = matrix 
> G 
function (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) 
{ 
    if (is.object(data) || !is.atomic(data)) 
     data <- as.vector(data) 
    .Internal(matrix(data, nrow, ncol, byrow, dimnames, missing(nrow), 
     missing(ncol))) 
} 
<bytecode: 0x000000001434fab0> 
<environment: namespace:base> 
> G%*%M 
Error in G %*% M : requires numeric/complex matrix/vector arguments 

。在这里,我可以用G创建一个矩阵,就像你可以与matrix

> G(c(0,1,1,2), nrow = 2) 
    [,1] [,2] 
[1,] 0 1 
[2,] 1 2 

您需要使用矩阵功能分配矩阵G,而不是本身的功能分配至G。然后乘法也起作用。

> G = matrix(c(0,1,1,2), nrow = 2) 
> G 
    [,1] [,2] 
[1,] 0 1 
[2,] 1 2 
> G%*%M 
    [,1] [,2] 
[1,] 1 0 
[2,] 2 1 
>