Yeah so the question is simple. Is there a way of filling anti-diagonal (or secondary diagonal) with a number.
I know that you can do
diag(A) = 2
for A, but what about anti-diagonal
Any help would be much appreciated.
This should work:
mm <- matrix(rep(0, 9), nrow = 3)
mm
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#> [3,] 0 0 0
mm[upper.tri(mm)] <- 1
mm[lower.tri(mm)] <- 2
mm
#> [,1] [,2] [,3]
#> [1,] 0 1 1
#> [2,] 2 0 1
#> [3,] 2 2 0
Created on 2020-10-08 by the reprex package (v0.3.0)
Iยดm sorry, If I was unclear with what I needed. I would actually need it to be like this, if I have n number of collums and rows
#> [,1] [,2] [,3]
#> [1,] 0 0 2
#> [2,] 0 2 0
#> [3,] 2 0 0
Oops, sorry, I misunderstood.
library(rray)
mm <- matrix(rep(0, 9), nrow = 3)
mm
#> [,1] [,2] [,3]
#> [1,] 0 0 0
#> [2,] 0 0 0
#> [3,] 0 0 0
diag(mm) <- 2
mm <- rray_flip(mm, 1)
mm
#> [,1] [,2] [,3]
#> [1,] 0 0 2
#> [2,] 0 2 0
#> [3,] 2 0 0
There has to be an easier way to do this, but this works.
Wow this would solve my problem, but when I enter the library(rray) command it tells me, that there is no package called rray
Yes, to use this solution you would need to install rray
first:
install.packages("rray")
or
remotes::install_github("r-lib/rray")
Thanks a lot. Works like a charm.
You can reference the indices of the anti-diagonal to fill in those values. For example:
mm <- matrix(rep(0, 9), nrow = 3)
mm[cbind(nrow(mm):1, 1:nrow(mm))] = 2
mm
[,1] [,2] [,3] [1,] 0 0 2 [2,] 0 2 0 [3,] 2 0 0
Turn it into a function:
adiag = function(x, val) {
n = nrow(x)
x[cbind(n:1, 1:n)] = val
x
}
mm <- matrix(rep(0, 9), nrow = 3)
adiag(mm, 2)
[,1] [,2] [,3] [1,] 0 0 2 [2,] 0 2 0 [3,] 2 0 0
This topic was automatically closed 21 days after the last reply. New replies are no longer allowed.
If you have a query related to it or one of the replies, start a new topic and refer back with a link.