hatinv_byname: Hatize and invert a vector In matsbyname: An Implementation of Matrix Mathematics

 hatinv_byname R Documentation

Hatize and invert a vector

Description

When dividing rows or columns of a matrix by elements of a vector, the vector elements are placed on the diagonal of a new matrix, the diagonal matrix is inverted, and the result is pre- or post-multiplied into the matrix. This function performs the hatizing and inverting of vector `v` in one step and takes advantage of computational efficiencies to achieve the desired result. The computational shortcut is apparent when one observes that the matrix produced by hatizing and inverting a vector is a diagonal matrix whose non-zero elements are the numerical inverses of the individual elements of `v`. So this function first inverts each element of `v` then places the inverted elements on the diagonal of a diagonal matrix.

Usage

```hatinv_byname(v, keep = NULL, inf_becomes = .Machine\$double.xmax)
```

Arguments

 `v` The vector to be hatized and inverted. `keep` See `matsbyname::hatize`. `inf_becomes` A value to be substitute for any `Inf` produced by the inversion process. Default is `.Machine\$double.xmax`. If `FALSE` (the default), `Inf` is not handled differently. If `TRUE`, `Inf` values in the resulting matrix are converted to zeroes.

Details

Note that this function gives the same result as `invert_byname(hatize_byname(v))`, except that `invert_byname(hatize_byname(v))` fails due to a singular matrix error when any of the elements of `v` are zero. This function will give `inf_becomes` on the diagonal of the result for each zero element of `v`, arguably a better answer. The sign of `Inf` is preserved in the substitution. The default value of `Inf_becomes` is `.Machine\$double.xmax`. Set `inf_becomes` to `NULL` to disable this behavior.

The default behavior is helpful for cases when the result of `hatinv_byname` is later multiplied by `0` to obtain `0`. Multiplying `Inf` by `0` gives `NaN` which would effectively end the stream of calculations.

Value

a square diagonal matrix with inverted elements of `v` on the diagonal

Examples

```v <- matrix(1:10, ncol = 1, dimnames = list(c(paste0("i", 1:10)), c("c1"))) %>%
setrowtype("Industries") %>% setcoltype(NA)
r <- matrix(1:5, nrow = 1, dimnames = list(c("r1"), c(paste0("c", 1:5)))) %>%
setrowtype(NA) %>% setcoltype("Commodities")
hatinv_byname(v, keep = "rownames")
hatinv_byname(r, keep = "colnames")
# This function also works with lists.
hatinv_byname(list(v, v), keep = "rownames")
# Watch out for 0 values
v2 <- matrix(0:1, ncol = 1, dimnames = list(c(paste0("i", 0:1)), c("p1"))) %>%
setrowtype("Industries") %>% setcoltype(NA)
# Produces singular matrix error
## Not run: v2 %>% hatize_byname() %>% invert_byname
# Handles 0 values well
hatinv_byname(v2, keep = "rownames")
hatinv_byname(v2, inf_becomes = 42, keep = "rownames")
hatinv_byname(v2, inf_becomes = NA, keep = "rownames")
# Deals with 1x1 matrices well, if the `keep` argument is set.
m <- matrix(42, nrow = 1, ncol = 1, dimnames = list("r1", "c1")) %>%
setrowtype("Product -> Industry") %>%
setcoltype("Industry -> Product")
m %>%
hatinv_byname(keep = "rownames")
m %>%
hatinv_byname(keep = "colnames")
```

matsbyname documentation built on April 2, 2022, 1:06 a.m.