如何有效生成对称矩阵的下三角索引

2023-12-09

我需要生成下三角矩阵索引(行和列对)。当前的实现效率低下(内存方面),特别是当对称矩阵变大(超过 50K 行)时。有没有更好的办法?

rows <- 2e+01
id <- which(lower.tri(matrix(, rows, rows)) == TRUE, arr.ind=T)
head(id)

#      row col
# [1,]   2   1
# [2,]   3   1
# [3,]   4   1
# [4,]   5   1
# [5,]   6   1
# [6,]   7   1

这是另一种方法:

z <- sequence(rows)
cbind(
  row = unlist(lapply(2:rows, function(x) x:rows), use.names = FALSE),
  col = rep(z[-length(z)], times = rev(tail(z, -1))-1))

较大数据的基准:

library(microbenchmark)

rows <- 1000
m <- matrix(, rows, rows)

## Your current approach
fun1 <- function() which(lower.tri(m) == TRUE, arr.ind=TRUE)

## An improvement of your current approach
fun2 <- function() which(lower.tri(m), arr.ind = TRUE)

## The approach shared in this answer
fun3 <- function() {
  z <- sequence(rows)
  cbind(
    row = unlist(lapply(2:rows, function(x) x:rows), use.names = FALSE),
    col = rep(z[-length(z)], times = rev(tail(z, -1))-1))
}

## Sven's answer
fun4 <- function() {
  row <- rev(abs(sequence(seq.int(rows - 1)) - rows) + 1)
  col <- rep.int(seq.int(rows - 1), rev(seq.int(rows - 1)))
  cbind(row, col)
}

microbenchmark(fun1(), fun2(), fun3(), fun4())
# Unit: milliseconds
#    expr       min        lq   median       uq       max neval
#  fun1() 77.813577 85.343356 90.60689 95.71648 130.40059   100
#  fun2() 73.812204 82.103600 85.87555 90.59235 138.66547   100
#  fun3()  9.016237  9.382506 10.63291 13.20085  55.42137   100
#  fun4() 20.591863 24.999702 28.82232 31.90663  65.05169   100
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何有效生成对称矩阵的下三角索引 的相关文章

随机推荐

  • 如何阻止 PHP 中的无限递归函数耗尽所有可用内存并最终导致笔记本电脑崩溃?

    我这里有一个简单的无限递归代码
  • 使用 TokenRegex 以所需格式获取输出

    我正在使用 TokensRegex 进行基于规则的实体提取 它运行良好 但我无法以所需的格式获得输出 以下代码片段为我提供了以下句子的输出 本月早些时候 特朗普针对丰田 威胁要对其实施制裁 如果世界上最大的汽车制造商生产卡罗拉 它将收取高额
  • bash 中的浮点除法

    我正在尝试将用户输入的任何数字转换为小数点后两位 例如 What is the total cost in cents 2345 output 23 45 这是我到目前为止的代码 percentage 20 cannot change nu
  • 从 WPF Web 浏览器静默打印 HTML

    我必须从 WPF 中的 WebBrowser 静默打印 HTML 文档 我已经通过该代码不默默地完成了它 mshtml IHTMLDocument2 doc WebBrowser1 Document as mshtml IHTMLDocum
  • 如何将固定功能材质和光照传递给片段着色器?

    我正在向 OpenGL 2 1 GLSL 1 2 应用程序添加顶点和片段着色器 顶点着色器 version 120 void main void gl Position ftransform gl FrontColor gl Color 片
  • 如何为加载项设置默认浏览器

    我正在尝试为我正在使用的 chrome 插件设置默认浏览器 但默认情况下它始终使用 IE 我该如何改变这个 我假设您正在谈论您的加载项生成新的浏览器窗口 弹出窗口的场景 在 Windows 上 这始终是 Internet Explorer
  • HTML 验证和 ASP.NET Webforms

    我正在尝试 HTML 内置验证属性 遇到的第一个困难是验证属性在表单上下文中工作 IE 如果你想验证两个独立的输入 那么你应该将它们放在两个不同的输入中
  • 是否可以覆盖 Local.config 文件中的 appSettings 和 connectionStrings?

    我们目前覆盖appSettings来自每个开发人员的 Local config 文件中的 web config 但是 我们还需要覆盖连接字符串 因此我们可以访问计算机上的本地副本 而 web config 可能会引用生产服务器 我知道您可以
  • Python:将嵌套列表作为输入?

    处理以下问题的最佳方法是什么 我想让用户输入一个嵌套列表 如下所示 grid input Enter grid 用户将输入如下所示的网格 X O X O X X 问题是我将此输入传递给一个期望输入是嵌套列表的函数 当获取输入网格时 它将是一
  • 如何在汇编中进行 64 位乘 64 位除法?

    如何在 x86 汇编中实现 64 位乘 64 位除法 我已经启用了扩展寄存器 386指示 EDX EAX 中的 64 位值除以 ECX EBX 中的 64 位值的无符号除法 在 32 位 x86 CPU 上 the div操作说明可以将 E
  • [jQuery]在 iFrame 内查找单击

    我有一个带有 iframe 的页面 div div 我需要拦截 iframe 内的点击 我尝试过使用这段代码 但它不起作用
  • 将列标题添加到新的 pandas 数据框中

    我正在使用以前的数据帧创建一个新的 pandas 数据帧 groupby and size方法 in results df groupby X Y Z F size out 9 27 02 2016 1 N 326 9 27 02 2016
  • 使用开关展开循环的 C++ 模板?

    我的问题类似于使用整数模板参数时可以展开循环吗 但我想混合编译时和运行时 具体来说 我在编译时知道一个常量NBLOCK我想在变量上写一个开关start block只有在运行时才知道NBLOCK是交换机中的条目数 这是我使用宏得到的结果 de
  • JavaScript 正则表达式与可变电子邮件域匹配

    我正在尝试进行客户端检查 如果输入的值 是一个有效的电子邮件地址 拥有正确的域名 我想出了以下代码 但它不起作用 var userinput email protected var domain somethingelse com doma
  • 预计读取 4 个标头字节,但只收到 0

    我编写了一个 Windows 服务 它使用 SSH 安全外壳 将数据从 CSV 文件复制到 PhpMyAdmin 在线数据库 连接打开时触发错误 MySql Data MySqlClient MySqlProtocolException H
  • 非常简单的程序的未定义引用

    当我安装 Ubuntu 11 10 后 出现奇怪的错误 我想在我的 C 程序中使用 GD 因此我安装了软件包 libgd2 xpm dev 一切都已安装 文件 gd h 和 libgd a 位于 usr include 和 usr lib
  • Spark:PySpark + Cassandra 查询性能

    我已在本地计算机 8 核 16GB 内存 上设置 Spark 2 0 和 Cassandra 3 0 以进行测试并进行编辑spark defaults conf如下 spark python worker memory 1g spark e
  • str.strip() 奇怪的行为[重复]

    这个问题在这里已经有答案了 gt gt gt t1 abcd org gz gt gt gt t1 abcd org gz gt gt gt t1 strip g abcd org gz gt gt gt t1 strip gz abcd
  • 通过与另一个数组进行比较来查找数组中的元素

    我有一个矩阵 a 1 cancer 2 cancer 3 cancer 4 noncancer 5 noncancer 我有另一个带有值的矩阵 b 4 5 2 现在我必须将 b 矩阵值与 a 值进行比较 输出应该是 output 4 non
  • 如何有效生成对称矩阵的下三角索引

    我需要生成下三角矩阵索引 行和列对 当前的实现效率低下 内存方面 特别是当对称矩阵变大 超过 50K 行 时 有没有更好的办法 rows lt 2e 01 id lt which lower tri matrix rows rows TRU