如何将两个矩阵相乘,用不同的运算符替换 *

问题描述 投票:0回答:1

考虑:

Library(Matrix)
A <- matrix(c(1,2,3,4,5,6), nrow=3)
A
t(A)
A %*% t(A)

这给出:

#  A
#      [,1] [,2]
#  [1,]    1    4
#  [2,]    2    5
#  [3,]    3    6
#
#  t(A)
#       [,1] [,2] [,3]
#  [1,]    1    2    3
#  [2,]    4    5    6
#  
#  A %*% t(A)
#       [,1] [,2] [,3]
#  [1,]   17   22   27
#  [2,]   22   29   36 <---
#  [3,]   27   36   45

问:我想用不同的二元运算符替换乘法 *,例如 min 或 max,最好是在 R 基数中。

在结果中使用矩阵乘法元素 2,3 得出 2 * 3 + 5 * 6 = 36。

相反,我想要:

  • min(2,3) + min(5,6) = 7,或
  • 最大(2,3) + 最大(5,6) = 9
r matrix matrix-multiplication
1个回答
3
投票

您可能正在追求以下东西

> a <- asplit(A, 1)

> outer(a, a, \(...) mapply(\(...) sum(pmin(...)), ...))
     [,1] [,2] [,3]
[1,]    5    5    5
[2,]    5    7    7
[3,]    5    7    9

> outer(a, a, \(...) mapply(\(...) sum(pmax(...)), ...))
     [,1] [,2] [,3]
[1,]    5    7    9
[2,]    7    7    9
[3,]    9    9    9

更高效解决方案(但会有更多代码行)正在使用

combn
。例如:

  • 对于
    min
    操作员
> m <- diag(rowSums(A))

> m[lower.tri(m)] <- combn(a, 2, \(...) sum(do.call(pmin, ...)))

> (out <- (m + t(m)) - diag(diag(m)))
     [,1] [,2] [,3]
[1,]    5    5    5
[2,]    5    7    7
[3,]    5    7    9
  • 对于
    max
    操作员
> m <- diag(rowSums(A))

> m[lower.tri(m)] <- combn(a, 2, \(...) sum(do.call(pmax, ...)))

> (out <- (m + t(m)) - diag(diag(m)))
     [,1] [,2] [,3]
[1,]    5    7    9
[2,]    7    7    9
[3,]    9    9    9
© www.soinside.com 2019 - 2024. All rights reserved.