考虑:
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。
相反,我想要:
您可能正在追求以下东西
> 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