当我尝试计算R中的列表和矩阵之间的差异时,我遇到了这个问题,这给了我奇怪的结果。
matrix <- matrix(1:10,1:10,nrow = 10,ncol=10)
list1 <- seq(1:10)
diff <- list1-matrix
下面是我试图实现的输出,但它不起作用。请让我知道我在做什么错。
答案 0 :(得分:0)
您需要了解的是,在R中,矩阵以列优先顺序存储。这意味着矩阵是由上至下按列顺序排列的数字序列。
因此,当您从矩阵中减去向量时,您可以将其想象成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, `-`)