例如,我有两个矩阵,我想知道它们在每个元素中是否相同。
mymatrix<-Matrix(rnorm(20),ncol=5)
mysvd<-svd(mymatrix)
newmatrix<-mysvd$u %*% diag(mysvd$d) %*% t(mysvd$v)
我用以下方法比较它们:
identical(Matrix(newmatrix), mymatrix)
all.equal(Matrix(newmatrix), mymatrix)
为什么第一个没有返回TRUE? 无论我使用矩阵包中的Matrix还是基础包中的矩阵
答案 0 :(得分:8)
由于差异很小,它们并不完全相等(每identical
个):
> max(abs(Matrix(newmatrix) - mymatrix))
[1] 1.110223e-15
但这些差异小于tolerance
内的默认all.equal
:
> .Machine$double.eps ^ 0.5
[1] 1.490116e-08
因此identical
将返回FALSE
而all.equal
将返回TRUE
。
答案 1 :(得分:7)
尝试以下方法:
> dput(Matrix(newmatrix))
new("dgeMatrix"
, x = c(-0.705193264426589, 0.68023073271425, 0.0726318059033283, -0.111055227906436,
-0.113940777963113, 0.726463241417717, -0.343435098646076, 0.885225942372688,
-0.549848405897803, -0.0227469387867766, -0.927524398860002,
0.58047674424687, 0.521144348439824, 0.279602090928527, -1.31686400403363,
0.906874499735628, -0.276997805548975, 0.632960950203858, 0.453881309098762,
-0.00528540521655077)
, Dim = 4:5
, Dimnames = list(NULL, NULL)
, factors = list()
)
> dput(newmatrix)
structure(c(-0.705193264426589, 0.68023073271425, 0.0726318059033283,
-0.111055227906436, -0.113940777963113, 0.726463241417717, -0.343435098646076,
0.885225942372688, -0.549848405897803, -0.0227469387867766, -0.927524398860002,
0.58047674424687, 0.521144348439824, 0.279602090928527, -1.31686400403363,
0.906874499735628, -0.276997805548975, 0.632960950203858, 0.453881309098762,
-0.00528540521655077), .Dim = 4:5)
显然,这些数据结构并不相同。
答案 2 :(得分:3)
您要比较的第一个:
> Matrix(newmatrix)
4 x 5 Matrix of class "dgeMatrix"
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5052901 -0.3264201 -0.8576401 -0.62666359 2.1076090
[2,] 0.2356111 0.4911067 -1.2376674 1.11231840 0.8576557
[3,] -0.6244670 1.4423943 -1.2820541 -0.05297437 -2.0458810
[4,] -0.2669079 1.1218459 0.6371571 -0.52168139 0.2163623
使用:
> mymatrix
[,1] [,2] [,3] [,4] [,5]
[1,] 0.5052901 -0.3264201 -0.8576401 -0.62666359 2.1076090
[2,] 0.2356111 0.4911067 -1.2376674 1.11231840 0.8576557
[3,] -0.6244670 1.4423943 -1.2820541 -0.05297437 -2.0458810
[4,] -0.2669079 1.1218459 0.6371571 -0.52168139 0.2163623
如果您阅读了identical
的帮助,您会看到:The safe and reliable way to test two objects for being _exactly_ equal.
您正在将Matrix
- 类对象与R标准矩阵对象进行比较。他们是非常不同的。即使两个具有不同属性的对象也不相同:
> x
a b c d
1 2 3 4
> y
[1] 1 2 3 4
> x==y
a b c d
TRUE TRUE TRUE TRUE
> identical(x,y)
[1] FALSE
答案 3 :(得分:-2)
您可以按如下方式检查2个矩阵是否相同(相同)。
假设您有2个矩阵newMatrix
和oldMatrix
,它们可以是任何维度。
which (which (newMatrix == oldMatrix) == FALSE)
将返回integer (0)
。