请考虑:

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,或
  • max(2,3)+ max(5,6)= 9

推荐答案

你可能想要做以下几件事

> 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

一个101的解决方案(但会有更多的代码行)是使用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

R相关问答推荐

在ggplot的注释表格中突出显示最大值

基于shiny 应用程序中的日期范围子集xts索引

单击 map 后,将坐标复制到剪贴板

如何删除R中除某些特定名称外的所有字符串?

获取一个数据库框架的摘要,该数据库框架将包含一列数据库框架,

使用sf或terra的LINESTRAING的累积长度

如何对2个列表元素的所有组合进行操作?

如何将R中数据帧中的任何Nas替换为最后4个值

将Posict转换为数字时的负时间(以秒为单位)

汇总数据的Sheffe检验的P值(平均值和标准差)

将数据集旋转到长格式,用于遵循特定名称模式的所有变量对

为什么这个表格格罗布不打印?

用多边形替换地块点

如何构建一个for循环来循环处理动物ID?

在ggploy中创建GeV分布时出错

构建一个6/49彩票模拟系统

R:如何在数据集中使用Apply

在子图内和子图之间对齐行数不均匀的表格罗布对

如何根据顺序/序列从数据框中排除值

使用相对风险回归计算RR