R中向量与矩阵之间的算术运算(差)

时间:2018-08-26 18:13:34

标签: r matrix arithmetic-expressions

当我尝试计算R中的列表和矩阵之间的差异时,我遇到了这个问题,这给了我奇怪的结果。

matrix <- matrix(1:10,1:10,nrow = 10,ncol=10)

list1 <- seq(1:10)

diff <- list1-matrix

下面是我试图实现的输出,但它不起作用。请让我知道我在做什么错。

Screenshot

2 个答案:

答案 0 :(得分:0)

您需要了解的是,在R中,矩阵以列优先顺序存储。这意味着矩阵是由上至下按列顺序排列的数字序列。

因此,当您从矩阵中减去向量时,您可以将其想象成4个步骤的运算:

  1. 矩阵变成数字序列(向量)
  2. 您的“ list1”被扩展(重复),使其长度与从矩阵构造的向量的长度匹配。
  3. 每个元素彼此相减
  4. 数字再次组合成矩阵形式。

在您的情况下:

1)矩阵变成一个数字序列(按列),为您提供:

1, 1, 1 ,1 ... 1, 2, 2, 2, 2, ... 2, ... ... 10, 10, 10, 10, ... 10

2)重复第二个向量,直到与第一个向量匹配为止。

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8, 9, 10, ... 1, 2, 3, ... 10

3)现在它们都具有相同的长度,因此它们彼此相减:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, ..., -9, -8, -7, ... 0

4)将结果再次转换为矩阵,为您提供所见的矩阵。

为了获得所需的结果,您必须考虑到这一点。一种方法是转置矩阵,进行减法,然后再次转置回去:

t(t(matrix) - list1)

之所以可行,是因为在转置t之后,行变成了列。

另一种方法是从list1向量中构造一个矩阵:

matrix2 <- matrix(list1, nrow=10, ncol=10, byrow=TRUE)

然后进行减法:

diff <- matrix - matrix2

答案 1 :(得分:0)

我们可以通过多种方式做到这一点

1 )转置矩阵,从vector中减去,然后执行transpose

t(t(matrix)- list1)

2 )复制vector以使长度相同,然后进行区别

matrix - list1[col(matrix)]

3 )使用sweep

sweep(matrix, 2, list1, `-`)