I am translating a code from Matlab to R. In Matlab, one of the code line is
C=A*B
where B is a matrix and A is either a matrix or a scalar (for example, A=1) depending on certain conditions. And this works perfectly well since matrix*matrix or scalar *matrix is written the same way in Matlab (up to appropriate dimensions for matrix multiplications, which is the case).
However, in R, things become a bit more complicated. This becomes
C=A %*% B
which works fine… unless A is a scalar. Indeed, just writing
1 %*% diag(5)
outputs
non-conformable arguments
while in Matlab, such a problem does not even exist.
Is there a way to translate my Matlab instruction C=A*B
in R while still keeping the flexibility I need, as described above ?
Note, that setting A to the identity matrix wouldn’t be satisfying: sometimes A is a scalar and cannot be changed into a matrix. I really need the "raw" flexibility described above
>Solution :
You can create your own infix operator to deal with this issue. tryCatch
is a way to deal with errors. If %*%
returns an error, then the function will execute x * y
:
`%m%` <- function(x, y) tryCatch(x %*% y, error = function(e) x * y)
Tests:
2 %m% diag(6)
[,1] [,2]
[1,] 2 0
[2,] 0 2
matrix(1:4, nrow = 2) %m% matrix(4:1, nrow = 2)
[,1] [,2]
[1,] 13 5
[2,] 20 8