给定索引,获取三角矩阵的行和列

Posted

技术标签:

【中文标题】给定索引,获取三角矩阵的行和列【英文标题】:Getting the Row and Column of a Triangular Matrix, Given the Index 【发布时间】:2012-03-12 20:18:35 【问题描述】:

我正在使用具有以下形式的 MxM 三角矩阵:

M = [m00 m10 m20 m30 m40]
    [m11 m21 m31 m41    ] 
    [m22 m32 m42        ]
    [m33 m43            ]
    [m44                ]

如果用索引来描述这个更容易,它看起来像这样:

M = [0 1 3 6 10]  
    [2 4 7 11  ]
    [5 8 12    ]
    [9 13      ]
    [14        ]

我知道这种索引方式可能看起来很奇怪,但如果我可以保持索引系统原样以便此模块与其他模块一起工作,它会容易得多。

我正在努力使用一种算法,该算法采用矩阵的索引和大小,该矩阵可以返回给定索引所属的行和列。理想情况下,我会有 2 个功能,例如:

int getRow (int index, int size);
int getCol (int index, int size);

所以getRow (7, 5) 会返回3

getCol (7, 5) 将返回1

我已经遇到过这个帖子,但我似乎无法修改那里给出的解决方案以适应我的索引方式。

algorithm for index numbers of triangular matrix coefficients

【问题讨论】:

是的,你是对的,我会进行编辑。尽管如此,我仍然无法重新设计其他主题中给出的算法以适应我的索引方式。 为什么 getRow (7, 5) 会返回 3? 因为我索引的方式,行是对角线(不是水平线)所以第 3 行是m30, m31, m32, m33 所以你的列是正常的,你的行是对角线的。 【参考方案1】:

新答案

您可以使用以下公式找到rowcolumn

int row = floor(-0.5 + sqrt(0.25 + 2 * index));
int triangularNumber = row * (row + 1) / 2;
int column = index - triangularNumber;

之所以有效,是因为每行中的第一项是triangular number (0, 1, 3, 6, 10, 15, ...)。所以小于index 的最大三角数给了我们row。那么column 就是index 和那个三角数的区别。

另外,请注意您不需要参数M


旧答案

此代码将为您提供indexrowcolumn

int triangularNumber = 0;
int row = 0;
while (triangularNumber + row < index) 
    row ++;
    triangularNumber += row;

int column = index - triangularNumber;

【讨论】:

非常感谢!看来我正试图以代数方式找出导致我出现问题的方法,但这种迭代解决方案同样有效。 @Redek,您确定要更改矩阵索引并在 O(n) 中找到行和列吗? @Saeed Amiri,毫无疑问,我愿意接受一个更有效的解决方案,但这个解决方案确实运作良好,对于我将要实现这个的系统,这个矩阵的最大大小只会是几千在我看来是微不足道的。话虽如此,我当然会欢迎其他解决方案,以维护自己的利益,甚至欢迎遇到类似问题但无法承受 O(n) 限制的其他人。 @sch 它是 O(n),因为矩阵是 n*n,我也同意你的观点,因为你回答了,我不明白为什么 OP 改变了对齐方式来获得这个运行时间! @Saeed Amiri,我认为我不关注?我如何更改对齐方式?我对 sch 的解决方案非常满意,无论是给出的解释还是他回复的速度。尽管拥有完美的 O(1) 解决方案是理想的,但我确实有系统的其他部分依赖于此,而这些部分又确实有一个截止日期,所以我很高兴我能够遇到一个解决方案。

以上是关于给定索引,获取三角矩阵的行和列的主要内容,如果未能解决你的问题,请参考以下文章

R:获取矩阵的最小元素的行和列名,但最小值!= 0

获取单元格的行和列,xlwings UDF在哪里被调用?

寻找二维数组中唯一的行和列的索引,以及这些位置上元素的最小和。

获取JTable点击事件的行和列

绘制二维矩阵的行和列

从 Java 中的二维数组矩阵中获取行和列