Cómo comparar dos matrices a ver si son idénticas en R?

Por ejemplo, tengo dos matrices y quiero saber si son idénticas en cada elemento.

mymatrix<-Matrix(rnorm(20),ncol=5)
mysvd<-svd(mymatrix) 
newmatrix<-mysvd$u %*% diag(mysvd$d) %*% t(mysvd$v)

He utilizado los siguientes métodos para la comparación:

identical(Matrix(newmatrix), mymatrix)
all.equal(Matrix(newmatrix), mymatrix)

Por qué la primera no devuelve VERDADERO?
No importa yo uso de la Matriz de la matriz de paquete o de la matriz de la base del paquete

OriginalEl autor Tyler 十三将士归玉门 | 2014-04-12

4 Kommentare

  1. 7

    Tratar el siguiente:

    > 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)

    Claramente estos no son las mismas estructuras de datos.

    OriginalEl autor G. Grothendieck

  2. 6

    Que no son exactamente iguales (por identical) debido a diferencias muy pequeñas:

    > max(abs(Matrix(newmatrix) - mymatrix))
    [1] 1.110223e-15

    pero estas diferencias son menores que el valor predeterminado tolerance dentro de all.equal:

    > .Machine$double.eps ^ 0.5
    [1] 1.490116e-08

    así identical volverá FALSE y all.equal volverá TRUE.

    OriginalEl autor flodel

  3. 2

    El primero que se están comparando:

    > 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

    con:

    > 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

    Y si usted lee la ayuda para identical puede ver: The safe and reliable way to test two objects for being _exactly_ equal. estás comparando un Matrix-objeto de la clase con una R matriz estándar de objetos. Son muy diferentes. Incluso dos objetos con diferentes atributos no ser idénticos:

    > 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

    OriginalEl autor Spacedman

  4. -2

    Puede verificar si 2 matrices son iguales (idénticos) o no se como sigue.

    Supongamos que tienes 2 matrices, newMatrix y oldMatrix, que podría ser de cualquier dimensión.

    which (which (newMatrix == oldMatrix) == FALSE) volverá integer (0) si las dos matrices son idénticas.

    OriginalEl autor Saket Shrivastava

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea