矩阵相减或相除时出现“不合格数组”错误

时间:2018-09-15 22:16:08

标签: r matrix

我有一个名为matrixoutput的5x3矩阵:

matrixoutput <- structure(c(755.012517738809, 713.680227809506, 796.559832334474, 
720.586278415567, 813.656728335122, 747.228849872966, 716.763851131365, 
790.005405393554, 719.099072835892, 794.80633176412, 747.924859415065, 
714.405749195011, 792.123774606548, 719.75129988389, 793.458302292789
), .Dim = c(5L, 3L))

我有一个名为matrixactual的5x1矩阵:

matrixactual <- structure(c(743.2, 710.37, 787.77, 721.41, 808), .Dim = c(5L, 
1L))

我正在尝试对matrixoutput中的每一列进行“ MAPE”计算,如下所示:

MAPE <- mean(abs((matrixactual-matrixoutput)/matrixactual) * 100)

但是这将返回错误:

  

matrixactual中的错误-matrixoutput:不合格数组

有任何解决方法的想法吗?我想有一个简单的解决方法。

4 个答案:

答案 0 :(得分:1)

尝试

colMeans(abs(sweep(matrixoutput, 1, matrixactual)) / rep(matrixactual,3))

此处的关键是跟踪尺寸。您可以轻松地将相同维数的矩阵彼此相减,但是当维数不同时,它将变得很棘手。在您的情况下,当您尝试从矩阵中减去向量时,R给您一条错误消息。

此处,sweep(a, 1, b)b的相应行中删除a中的每个值。然后,您需要用一个尺寸与matrixoutput对齐的对象进行划分,如果重复三次matrixactual,就是这种情况。

一种替代方法

colMeans((matrixoutput - rep(matrixactual, 3)) / rep(matrixactual,3))

答案 1 :(得分:1)

问题是matrixactual-matrixoutput。您正在从5x1矩阵中减去5x3矩阵。以这种方式进行减法是一对一的操作,需要相同尺寸的对象。您应该使用sweepcolMeans来获取正确的尺寸数:

MAPE <- colMeans(abs(sweep(matrixoutput,1,matrixactual)))

答案 2 :(得分:1)

matrixactual <- c(matrixactual)  ## I mean `base::c`
colMeans(abs((matrixactual - matrixoutput) / matrixactual) * 100)

"Recycling rule""-""/"之后工作。


有时候我们可能会遇到更加模糊的情况:

A <- matrix(1:15, 5, 3)
b <- array(1:5, dim = 5)
b
#[1] 1 2 3 4 5

b看起来像矢量,但实际上不是。它是具有“ dim”属性的一维数组。 "-"会抱怨尺寸不一致。

A - b
#Error in A - b : non-conformable arrays

使用A - c(b)来实际使用“回收规则”。

此外,"%*%"也会失败。

A %*% b
#Error in A %*% b : non-conformable arguments

解决方案是A %*% c(b)

一维数组在单个输入上使用时由table函数返回。因此,我在这里只想说一句:也许健壮的代码段应始终检查维度。

答案 3 :(得分:0)

此: MAPE <-colMeans(abs(-matrixoutput + matrixactual [,1]))
给出:[1] 6.078606 5.632540 5.862956

与以下内容的输出相同:
MAPE <-colMeans(abs(sweep(matrixoutput,1,matrixactual))

我认为,这对于非R程序员来说更直接。 但是,我不明白为什么[,1]是必需的。