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

Arithmetic operation (Difference) between a vector and a Matrix in R

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

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

list1 <- seq(1:10)

diff <- list1-matrix

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

您需要了解的是,在 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) 转置矩阵,从 vector 中减去,然后执行 transpose

t(t(matrix)- list1)

2) 复制 vector 使长度相同然后做差异

matrix - list1[col(matrix)]

3) 使用 sweep

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