三角矩阵系数索引号的算法

2024-01-26

我认为这一定很简单,但我无法正确理解......

我有一个 MxM 三角矩阵,其系数逐行存储在向量中。 例如:

M =   [ m00 m01 m02 m03 ] 
      [     m11 m12 m13 ]
      [         m22 m23 ]
      [             m33 ]

存储为

coef[ m00 m01 m02 m03 m11 m12 m13 m22 m23 m33 ]

现在我正在寻找一种非递归算法,可以给出矩阵大小M和系数数组索引i

unsigned int row_index(i,M)

and

unsigned int column_index(i,M)

它所引用的矩阵元素的值。所以,row_index(9,4) == 3, column_index(7,4) == 2等等,如果索引计数是从零开始的。

编辑:已经给出了几个使用迭代的回复。有谁知道代数表达式吗?


本回复末尾有一句俏皮话,解释如下:-)

系数数组包含:第一行(索引中的第 0 行)有 M 个元素,第二行(第 1 行)有 (M-1) 个元素,依此类推,总共有 M+(M-1)+…+ 1=M(M+1)/2个元素。

从最后开始工作会稍微容易一些,因为系数数组always最后一行(M-1 行)有 1 个元素,倒数第二行(M-2 行)有 2 个元素,M-3 行有 3 个元素,依此类推。最后 K 行占据系数数组的最后 K(K+1)/2 个位置。

现在假设您在系数数组中得到了一个索引 i。大于 i 的位置有 M(M+1)/2-1-i 个元素。拨打这个号码 i';你想找到最大的 k 使得 k(k+1)/2 ≤ i'。这个问题的形式正是你痛苦的根源——据我所知,你无法避免求平方根:-)

Well let's do it anyway: k(k+1) ≤ 2i' means (k+1/2)2 - 1/4 ≤ 2i', or equivalently k ≤ (sqrt(8i'+1)-1)/2. Let me call the largest such k as K, then there are K rows that are later (out of a total of M rows), so the row_index(i,M) is M-1-K. As for the column index, K(K+1)/2 elements out of the i' are in later rows, so there are j'=i'-K(K+1)/2 later elements in this row (which has K+1 elements in total), so the column index is K-j'. [Or equivalently, this row starts at (K+1)(K+2)/2 from the end, so we just need to subtract the starting position of this row from i: i-[M(M+1)/2-(K+1)(K+2)/2]. It is heartening that both expressions give the same answer!]

(伪)代码[使用 ii 而不是 i',因为某些语言不允许使用像 i' 这样的名称的变量;-)]:

row_index(i, M):
    ii = M(M+1)/2-1-i
    K = floor((sqrt(8ii+1)-1)/2)
    return M-1-K

column_index(i, M):
    ii = M(M+1)/2-1-i
    K = floor((sqrt(8ii+1)-1)/2)
    return i - M(M+1)/2 + (K+1)(K+2)/2

当然,您可以通过替换 ii 和 K 的表达式将它们变成直线。您可能必须小心精度误差,但有一些方法可以找到不需要浮点计算的整数平方根。另外,引用 Knuth 的话:“当心上述代码中的错误;我只是证明了它的正确性,没有尝试过。”

如果我可以斗胆做进一步的评论:简单地将所有值保留在 M×M 数组中最多将占用两倍的内存,并且根据您的问题,与算法改进相比,2 的因子可能微不足道,并且可能是值得用可能昂贵的平方根计算来换取更简单的表达式。

[编辑:顺便说一句,你可以证明 Floor((sqrt(8ii+1)-1)/2) = (isqrt(8ii+1)-1)/2 其中 isqrt(x)=floor(sqrt(x))是整数平方根,除法是整数除法(截断;C/C++/Java 等中的默认设置)——所以如果您担心精度问题,您只需要担心实现正确的整数平方根。]

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三角矩阵系数索引号的算法 的相关文章

  • Python 给定 k 个分区的整数分区

    我正在尝试寻找或开发Python 的整数分区代码 仅供参考 整数分区将给定整数 n 表示为小于 n 的整数之和 例如 整数5可以表示为4 1 3 2 3 1 1 2 2 1 2 1 1 1 1 1 1 1 1 我为此找到了许多解决方案 ht
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 快速求解子集和

    考虑这种解决子集和问题的方法 def subset summing to zero activities subsets 0 for activity cost in activities iteritems old subsets sub
  • 通过分布式数据库聚合作业优化网络带宽

    我有一个分布式 联合数据库 结构如下 数据库分布在三个地理位置 节点 每个节点集群有多个数据库 关系数据库是 PostgreSQL MySQL Oracle 和 MS SQL Server 的混合体 非关系数据库是 MongoDB 或 Ca
  • 确定解决迷宫问题的最小线段数

    我有一个问题 我需要定义一个具有最少数量的顶点的多边形 该多边形与不透明的图像中的每个像素相交或包含每个像素 令 N 为图像中的像素数 我唯一的假设是图像的边界 孔 内不能包含透明像素 并且至少有两个像素是不透明的 举个例子 假设我有以下图
  • 如何将无向图转换为 DAG?

    The 维基页面 http en wikipedia org wiki Directed acyclic graph Relation to other kinds of graphs says 任何无向图都可以通过为其顶点选择总顺序并将每
  • 图中的后边

    I m having a hard time understanding Tarjan s algorithm for articulation points I m currently following this tutorial he
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 快速搜索压缩文本文件

    我需要能够在大量压缩文件 txt 中搜索文本 压缩可能会改变为其他东西 甚至成为专有的 我想避免解压所有文件并压缩 编码 搜索字符串并在压缩文件中搜索 这应该可以通过对所有文件使用相同的码本使用霍夫曼压缩来实现 我不想重新发明轮子 所以 任
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • 使用多级解决方案计算二维网格中的最近邻

    我有一个问题 在 x y 大小的网格中 我提供了一个点 并且我需要找到最近的邻居 在实践中 我试图在 pygame 中找到距离光标最近的点 该点跨越颜色距离阈值 计算如下 sqrt rgb1 0 rgb2 0 2 rgb1 1 rgb2 1
  • 如何有效地找到距给定点最远的点(从一组点中)?

    我正在寻找一种算法或数据结构来解决以下问题 给你一组点 S 然后你会得到另一个点形式的 Q 查询 对于每个查询 找到集合中距离给定点最远的点 集合中最多有 10 5 个点和 10 5 个查询 所有点的坐标都在 0 到 10 5 范围内 我想
  • 计算两点之间的最短路线

    过去几周我一直在开发一款多人 HTML5 游戏 使用nodejs and websockets 我已经被这个问题困扰了一段时间 想象一下 我用数组实现了这个平铺地图 如下所示 1 or 棕色瓷砖 路上有障碍物 玩家无法通过 0 or 绿色瓷
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 归并排序中递归树的高度log(n)+1是怎么来的

    我按照 stackoveflow 的建议阅读了一些问题和答案 我正在遵循 cormen 的 算法简介 一书进行自学 那本书里已经解释得很清楚了 但唯一没有解释的是如何在合并排序分析中计算树的高度 如果在后面的章节中对此进行解释的话 我仍然在
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 举例解释bpe(字节对编码)?

    有人可以帮忙解释一下背后的基本概念吗BPE模型 除了这张纸 https arxiv org abs 1508 07909 目前还没有那么多解释 到目前为止我所知道的是 它通过将罕见和未知的单词编码为子词单元序列来实现开放词汇表上的 NMT
  • 用于开始和/或包含搜索的最快字符串集合结构/算法是什么

    我有以下情况 我有一个大的字符串集合 比如说 250 000 平均长度可能是 30 我要做的就是在这些搜索中进行许多搜索 大多数搜索都是 StartsWith 和 Contains 类型的 该集合在运行时是静态的 这意味着选择的集合的初始读
  • n 或 nlog(n) 比常数时间或对数时间更好吗?

    在 Coursera 上的普林斯顿教程中 讲师解释了遇到的常见增长顺序函数 他说 线性和线性算术运行时间是 我们努力的目标 他的推理是 随着输入大小的增加 运行时间也会增加 我认为这是他犯了错误的地方 因为我之前听过他提到线性增长顺序对于高
  • 每个术语出现的次数

    我得到了一个数组a n 2 where n can be 10 5最大时有n个科目和n个学生 全部编号为 1 2 n a i 0 and a i 1 1 lt i lt n 表示在第 i 个科目中 所有来自a i 0 to a i 1 通过

随机推荐

  • 使 Box2d 对象遵循预定路径

    我正在制作一个游戏 其中某个对象 建模为 box2d 主体 必须遵循固定路径 有没有一种方法可以指定路径坐标并使对象在每个 dt 上前进 Thanks 另外一个选择 将鼠标关节连接到您的身体上 使用鼠标关节的setTarget方法来移动身体
  • 枚举常量特定的类体是静态的还是非静态的?

    我有一个枚举类型类 public enum Operation PLUS Override double apply double x double y ERROR Cannot make a static reference to the
  • MongoDB聚合项目检查数组是否包含

    我有以下文件 id 21353456 username xy text asdf comments username User1 text hi username User2 text hi1 username User3 text hi2
  • JOLT 移位转换以过滤数组中的值

    我想使用 JOLT 转换来做两件事 过滤名为 myarray 的数组中的元素 以便仅保留具有 v 518 属性的元素 过滤掉除 v 518 和 lfdn 之外的其余元素的所有属性 Input isError false isValid tr
  • 等待异步读取所有文件(FileReader),然后运行代码

    我有一个页面 用户可以在其中选择一个文件夹来上传文件 在发送文件之前 我需要阅读它们并检查数据 我的代码组织如下 folder select on change getValidFileList var fileList var getVa
  • 如何安排 Callable 在特定时间运行?

    我需要在一天中的特定时间运行可调用的 一种方法是计算现在与所需时间之间的时间差 并使用 executor scheduleAtFixedRate 有更好的主意吗 executor scheduleAtFixedRate command TI
  • 选择计数 = 1 的位置

    Table LESSON有字段LessonDate MemberId 除其他外 但只有这两个是相关的 英语 给我一份只上过一门课的学生上这门课的日期列表 我已经尝试了很多事情 这是我的最新尝试 SELECT LessonDate FROM
  • 如何在 Azure 搜索 REST API 上使用“id”删除特定文档?

    我想知道如何删除Azure搜索索引中的特定文档 我想通过 REST API 使用 id 来删除文档 我曾寻找过 但找不到路 odata context https xxxx metadata docs value search score
  • 为什么 rake asset:precompile 在开发中会出现问题,但在我的生产环境中不会出现问题

    我已将 heroku 上的应用程序升级为 cedar stack 以便资产管道正常工作 我已按照中给出的说明进行操作Heroku 的文档 https devcenter heroku com articles rails3x asset p
  • git clone 后跟状态显示未跟踪的文件

    抱歉 我是 git 新手 尽管我非常熟悉旧的源代码控制系统 如 cvs 和 svn 我的最终目标是通过在本地克隆远程存储库 将文件添加到本地存储库 提交更改 然后将本地存储库推回远程 将文件添加到远程存储库 不在我的计算机上 我试过这个 g
  • 访问 WCF UsernamePasswordValidator 中的当前 InstanceContext

    我有一个使用自定义 UsernamePasswordValidator 的 WCF 服务 验证器需要访问我的实体框架上下文 我想为整个服务调用创建一个 ObjectContext 然后在调用结束时销毁 处置它 因此 我创建了一个提供此功能的
  • 从 C# 的 zip 文件中读取二进制文件而不解压它

    我想从 zip 文件中读取二进制文件而不解压缩它 zip 文件结构 zipFolderName subFolder BinFile 在 BinFile 中 我有 Id1 id2 value1 id1 id2 are string value
  • 从子列表中检索升序整数的所有可能组合

    我有包含子列表的列表 我想从这些列表中检索按升序排列的所有整数组合 子列表的顺序也很重要 请参阅预期输出 当函数也返回整数本身时 这并不是一件坏事 请参阅预期输出中的可选子列表 另外 当子列表具有多个值时 我也想将这些值视为单独的组合 这些
  • 在 Linux 上使用 boost::serialization 序列化 unique_ptr 的 std::vector 失败

    我在使用 std unique ptr 的 std vector 的 boost 序列化时遇到问题 unique ptr 的类型并不重要 在下面的示例中 使用整数 include
  • !!处理请求时出现意外错误:无法分配内存

    请帮助我解决这个错误 使用 ruby 脚本将记录从文本文件加载到数据库时出现此错误 如果我使用少量记录加载到数据库中 它就可以正常工作 但如果有大量记录 则失败 CSV foreach fileName do line completePa
  • Microsoft Graph API:访问控制允许来源

    我正在尝试集成 Microsoft Graph 身份验证和访问共享点以及用户的图形配置文件和图片 我遵循了他们的文件https developer microsoft com en us graph docs authorization a
  • Qt3D默认制服和属性

    我开始学习通过 QML 使用着色器 但找不到任何讨论传递给着色器的默认统一和属性值的参考资料 在某些示例中 我们可以看到其中的几个 例如顶点位置 or 模型视图投影 这也被传递为mvp 但是没有包含我们可以使用的所有变量的清晰列表 在调查
  • 跨区域小数/双精度解析

    事实上 我有多个可以生成数字数据的系统 它们以文本文件的形式存储在某些网络服务器上 有些系统使用小数点作为分数分隔符 有些系统也使用小数点逗号 应用程序 胖客户端 net 2 0 也可以在任一类型的系统上运行 因此 经过一番绊倒后 我这样做
  • Count 总是返回 1...但是它存在吗?

    我试图在创建文件名之前检查特定类别的 评论 列中是否已存在文件名 如果它已经存在 我想将今天的日期添加到名称中以使其成为唯一的文件名 我似乎无法使用计数来查找它是否存在 当我 echo checkfile 时 无论文件存在与否 它总是返回
  • 三角矩阵系数索引号的算法

    我认为这一定很简单 但我无法正确理解 我有一个 MxM 三角矩阵 其系数逐行存储在向量中 例如 M m00 m01 m02 m03 m11 m12 m13 m22 m23 m33 存储为 coef m00 m01 m02 m03 m11 m