【问题标题】:"non-conformable arrays" error when subtracting or dividing matrices减去或分割矩阵时出现“不一致的数组”错误
【发布时间】:2018-09-15 22:16:08
【问题描述】:

我有一个名为 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 : non-conformable arrays

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

【问题讨论】:

    标签: r matrix


    【解决方案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 函数在用于单个输入时返回一维数组。所以我在这里的阐述只是想说:也许一段健壮的代码应该总是检查维度。

    【讨论】:

      【解决方案2】:

      问题是matrixactual-matrixoutput。您正在从 5x1 矩阵中减去 5x3 矩阵。这种减法是一对一的运算,需要相同维度的对象。您应该使用sweepcolMeans 来获得正确的维度数:

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

      【讨论】:

        【解决方案3】:

        试试

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

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

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

        另一种选择是

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

        【讨论】:

          【解决方案4】:

          这个: MAPE 给:[1] 6.078606 5.632540 5.862956

          这与以下输出相同:
          MAPE

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-10
            • 2016-01-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多