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 个步骤的操作:
- 矩阵变成数字序列(向量)
- 你的 "list1" 被扩展(重复),因此它的长度与从矩阵构造的向量的长度相匹配。
- 每个中的元素相互减去
- 数字再次组合成矩阵形式
你的情况:
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, `-`)
我在尝试计算 R 中的列表和矩阵之间的差异时遇到了这个问题,结果很奇怪。
matrix <- matrix(1:10,1:10,nrow = 10,ncol=10)
list1 <- seq(1:10)
diff <- list1-matrix
下面是我试图实现的输出,但它不起作用。请让我知道我做错了什么。
您需要了解的是,在 R 中,矩阵是以列优先顺序存储的。这意味着矩阵是从上到下按列排列的数字序列。
因此,当您从矩阵中减去一个向量时,您可以将其想象为具有 4 个步骤的操作:
- 矩阵变成数字序列(向量)
- 你的 "list1" 被扩展(重复),因此它的长度与从矩阵构造的向量的长度相匹配。
- 每个中的元素相互减去
- 数字再次组合成矩阵形式
你的情况:
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, `-`)