matlab 允许R中的“隐藏”标量乘法

vptzau2j  于 2023-05-07  发布在  Matlab
关注(0)|答案(3)|浏览(106)

我正在把一段代码从Matlab翻译成R语言。在Matlab中,其中一个代码行是

C=A*B

其中,B是矩阵,并且A是矩阵或标量(例如,A=1),这取决于某些条件。这很好地工作,因为矩阵 * 矩阵或标量 * 矩阵在Matlab中以相同的方式编写(直到矩阵乘法的适当维度,这就是情况)。
然而,在R中,事情变得有点复杂。这成为

C=A %*% B

这很好用除非A是标量。的确,只是写作
产出
不一致变元
而在Matlab中,甚至不存在这样的问题。
有没有一种方法可以将我的Matlab指令C=A*B翻译成R,同时仍然保持我所需要的灵活性,如上所述?
注意,将A设置为单位矩阵将不满足:有时A是一个标量,不能转化为矩阵。我真的需要上面描述的“原始”灵活性

iyr7buue

iyr7buue1#

您可以创建自己的中缀运算符来处理此问题。tryCatch是一种处理错误的方法。如果%*%返回错误,则函数将执行x * y

`%m%` <- function(x, y) tryCatch(x %*% y, error = function(e) x * y)

测试:

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
voj3qocg

voj3qocg2#

对于您的具体要求,可以试试

ifelse(is.matrix(A), `%*%`, `*`)(A, B)

等着瞧吧

> B <- matrix(1:4, 2)

> A <- 2

> ifelse(is.matrix(A), `%*%`, `*`)(A, B)
     [,1] [,2]
[1,]    2    6
[2,]    4    8

> A <- matrix(4:1, 2)

> ifelse(is.matrix(A), `%*%`, `*`)(A, B)
     [,1] [,2]
[1,]    8   20
[2,]    5   13
zy1mlcev

zy1mlcev3#

在一个ifelse

mm=function(A,B){
  ifelse(is.matrix(A),list(A),list(diag(nrow(B))*A))[[1]] %*% B
}

A=1.3
B=matrix(1:4,2,2)
mm(A,B)
     [,1] [,2]
[1,]  1.3  3.9
[2,]  2.6  5.2

A=matrix(1:4,2,2)
mm(A,B)
     [,1] [,2]
[1,]    1    3
[2,]    8   16

相关问题