RosettaCodeData/Task/Conjugate-transpose/R/conjugate-transpose.r
2026-02-01 16:33:20 -08:00

39 lines
1 KiB
R

conj_t <- function(mat) t(Conj(mat))
near_eq <- function(x, y, eps=10^-10) all(abs(x-y)<eps)
is_hermitian <- function(mat) near_eq(mat, conj_t(mat))
is_normal <- function(mat){
mat_h <- conj_t(mat)
near_eq(mat%*%mat_h, mat_h%*%mat)
}
is_unitary <- function(mat){
id <- diag(nrow(mat))
near_eq(mat%*%conj_t(mat), id)
}
mat1 <- matrix(c(3+0i, 2-1i, 2+1i, 1+0i), nrow=2)
mat2 <- matrix(complex(real=c(1, 0, 1, 1, 1, 0, 0, 1, 1),
imaginary=0),
nrow=3)
s <- sqrt(2)/2
mat3 <- matrix(complex(real=c(s, 0, 0, s, rep(0, 5)),
imaginary=c(0, -s, 0, 0, s, 0, 0, 0, 1)),
nrow=3)
conj_tests <- function(mat){
cat("\nChosen matrix:\n")
print(mat)
cat("\nConjugate transpose:\n")
print(conj_t(mat))
test_funs <- c(is_hermitian, is_normal, is_unitary)
results <- sapply(test_funs, function(f) f(mat))
queries <- c("Hermitian?", "Normal?", "Unitary?")
writeLines(paste(queries, results))
}
sapply(list(mat1, mat2, mat3), conj_tests) |> invisible()