## PR#4582 %*% with NAs stopifnot(is.na(NA %*% 0), is.na(0 %*% NA)) ## depended on the BLAS in use. ## found from fallback test in slam 0.1-15 ## most likely indicates an inaedquate BLAS. x <- matrix(c(1, 0, NA, 1), 2, 2) y <- matrix(c(1, 0, 0, 2, 1, 0), 3, 2) (z <- tcrossprod(x, y)) stopifnot(identical(z, x %*% t(y))) stopifnot(is.nan(log(0) %*% 0)) ## depended on the BLAS in use: some (including the reference BLAS) ## had z[1,3] == 0 and log(0) %*% 0 as as.matrix(0). ## matrix products for(mopt in c("default","internal","default.simd")) { # matprod="blas" is excluded because some tests fail due to issues # in NaN/Inf propagation even in Rblas options(matprod=mopt) m <- matrix(c(1,2,3,4), ncol=2) v <- c(11,12) rv <- v; dim(rv) <- c(1,2) cv <- v; dim(cv) <- c(2,1) Cm <- m+0*1i; # cast to complex keeping dimensions Cv <- v+0*1i; Ccv <- cv+0*1i; Crv <- rv+0*1i; cprod <- function(rres, cres, expected) { stopifnot(identical(rres, expected)) stopifnot(identical(Re(cres), expected)) } cprod(m %*% m, Cm %*% Cm, matrix(c(7,10,15,22), 2, 2) ) cprod(m %*% cv, Cm %*% Ccv, matrix(c(47,70), 2, 1) ) cprod(m %*% v, Cm %*% Cv, matrix(c(47,70), 2, 1) ) cprod(rv %*% m, Crv %*% Cm, matrix(c(35,81), 1, 2) ) cprod(v %*% m, Cv %*% Cm, matrix(c(35,81), 1, 2) ) cprod(rv %*% cv, Crv %*% Ccv, matrix(265,1,1) ) cprod(cv %*% rv, Ccv %*% Crv, matrix(c(121,132,132,144), 2, 2) ) cprod(v %*% v, Cv %*% Cv, matrix(265,1,1) ) cprod(crossprod(m, m), crossprod(Cm, Cm), matrix(c(5,11,11,25), 2, 2) ) cprod(crossprod(m), crossprod(Cm), matrix(c(5,11,11,25), 2, 2) ) cprod(crossprod(m, cv), crossprod(Cm, Ccv), matrix(c(35,81), 2, 1) ) cprod(crossprod(m, v), crossprod(Cm, Cv), matrix(c(35,81), 2, 1) ) cprod(crossprod(cv, m), crossprod(Ccv, Cm), matrix(c(35,81), 1, 2) ) cprod(crossprod(v, m), crossprod(Cv, Cm), matrix(c(35,81), 1, 2) ) cprod(crossprod(cv, cv), crossprod(Ccv, Ccv), matrix(265,1,1) ) cprod(crossprod(v, v), crossprod(Cv, Cv), matrix(265,1,1) ) cprod(crossprod(rv, rv), crossprod(Crv, Crv), matrix(c(121,132,132,144), 2, 2) ) cprod(tcrossprod(m, m), tcrossprod(Cm, Cm), matrix(c(10,14,14,20), 2, 2) ) cprod(tcrossprod(m), tcrossprod(Cm), matrix(c(10,14,14,20), 2, 2) ) cprod(tcrossprod(m, rv), tcrossprod(Cm, Crv), matrix(c(47,70), 2, 1) ) cprod(tcrossprod(rv, m), tcrossprod(Crv, Cm), matrix(c(47,70), 1, 2) ) cprod(tcrossprod(v, m), tcrossprod(Cv, Cm), matrix(c(47,70), 1, 2) ) cprod(tcrossprod(rv, rv), tcrossprod(Crv, Crv), matrix(265,1,1) ) cprod(tcrossprod(cv, cv), tcrossprod(Ccv, Ccv), matrix(c(121,132,132,144), 2, 2) ) cprod(tcrossprod(v, v), tcrossprod(Cv, Cv), matrix(c(121,132,132,144), 2, 2) ) ## non-square matrix, with Inf m1 <- matrix(c(1,2,Inf,4,5,6), ncol=2) m2 <- matrix(c(1,2,3,4), ncol=2) v <- c(11,12) rv <- v; dim(rv) <- c(1,2) cv <- v; dim(cv) <- c(2,1) v1 <- c(11,12,13) rv1 <- v1; dim(rv1) <- c(1,3) cv1 <- v1; dim(cv1) <- c(3,1) Cm1 <- m1+0*1i Cm2 <- m2+0*1i Cv <- v+0*1i Crv <- rv+0*1i Ccv <- cv+0*1i Cv1 <- v1+0*1i Crv1 <- rv1+0*1i Ccv1 <- cv1+0*1i cprod(m1 %*% m2, Cm1 %*% Cm2, matrix(c(9,12,Inf,19,26,Inf), 3, 2) ) cprod(m1 %*% cv, Cm1 %*% Ccv, matrix(c(59,82,Inf), 3, 1) ) # the following 7 lines fail with Rblas and matprod = "blas" cprod(rv1 %*% m1, Crv1 %*% Cm1, matrix(c(Inf,182), 1, 2) ) cprod(crossprod(m1, m1), crossprod(Cm1, Cm1), matrix(c(Inf,Inf,Inf,77), 2, 2) ) cprod(crossprod(m1, cv1), crossprod(Cm1, Ccv1), matrix(c(Inf,182), 2, 1) ) cprod(crossprod(cv1, m1), crossprod(Ccv1, Cm1), matrix(c(Inf,182), 1, 2) ) cprod(tcrossprod(m1, m1), tcrossprod(Cm1, Cm1), matrix(c(17,22,Inf,22,29,Inf,Inf,Inf,Inf), 3,3) ) cprod(tcrossprod(m2, m1), tcrossprod(Cm2, Cm1), matrix(c(13,18,17,24,Inf,Inf), 2, 3) ) cprod(tcrossprod(rv, m1), tcrossprod(Crv, Cm1), matrix(c(59,82,Inf), 1, 3) ) # the previous 7 lines fail with Rblas and matprod = "blas" cprod(tcrossprod(m1, rv), tcrossprod(Cm1, Crv), matrix(c(59,82,Inf), 3, 1) ) ## complex m1 <- matrix(c(1+1i,2+2i,3+3i,4+4i,5+5i,6+6i), ncol=2) m2 <- matrix(c(1+1i,2+2i,3+3i,4+4i), ncol=2) stopifnot(identical(m1 %*% m2, matrix(c(18i,24i,30i,38i,52i,66i), 3, 2) )) stopifnot(identical(crossprod(m1, m1), t(m1) %*% m1)) stopifnot(identical(tcrossprod(m1, m1), m1 %*% t(m1))) } ## check that propagation of NaN/Inf values in multiplication of complex ## numbers is the same as in multiplication of complex matrices for(mopt in c("default","internal","default.simd")) { # matprod="blas" is excluded because some tests fail due to issues # in NaN/Inf propagation even in Rblas options(matprod=mopt) vals <- c(0, 1, NaN, Inf) for(ar in vals) for(ai in vals) for(br in vals) for(bi in vals) { a = ar + 1i * ai b = br + 1i * bi stopifnot(identical(a * b, as.complex(a %*% b))) stopifnot(identical(a * b, as.complex(crossprod(a,b)))) stopifnot(identical(a * b, as.complex(tcrossprod(a,b)))) } }