从下/上三角矩阵中给出一个元素

Posted

技术标签:

【中文标题】从下/上三角矩阵中给出一个元素【英文标题】:Giving an element from lower/upper triangular matrix 【发布时间】:2016-09-30 14:35:17 【问题描述】:

我有一个矩阵的上三角部分,主对角线存储为一个线性数组,如何从数组的线性索引中提取矩阵元素的 (i,j) 索引?

例如线性数组:[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10]是矩阵的存储

a0  a1  a2  a3
0   a4  a5  a6
0   0   a7  a8
0   0   0   a10

我找到了解决这个问题的方法,但没有主对角线:

index = (n*(n-1)/2) - (n-i)*((n-i)-1)/2 + j - i - 1

同样问题的解决方案,但对角线的下三角矩阵:

index = ((i + 1) * i / 2 + i).

问候,

【问题讨论】:

听起来像是一道作业题。你试过什么?它产生了什么结果?您可以修改没有主对角线的那个以使用主对角线吗? 我试过这个没有对角线:k = (n*(n-1)/2) - (n-i)*((n-i)-1)/2 + j - i - 1 这适用于对角线的下三角:((I + 1) * I / 2 + J)。 @Bako 您能否将其与您使用的代码一起包含在问题中。您在这里提供的是逻辑,并不是每个人都关注 cmets。所以,请编辑问题。 “将主对角线存储为线性数组”是否有错误?似乎线性 vector 存储了上三角部分,包括主对角线? @AhmedFasih 不,我的意思是我存储矩阵的上三角部分,包括主对角线。 【参考方案1】:

我的解决方案可能相当于your’s,我没查过:

index = N * i - ((i - 1) * i) / 2 + (j - i)

这是一个完整的 Python 测试。我使用 Python 是因为 Numpy 有 triu_indices,它给出了上三角索引。

import numpy as np

def mksquare(N):
    """Make a square N by N matrix containing 0 .. N*N-1"""
    return np.arange(N * N).reshape(N, N)

def mkinds(N):
    """Return all triu indexes for N by N matrix"""
    return [(i,j) for i in range(N) for j in range(N) if i <= j]

def ij2linear(i, j, N):
    """Convert (i,j) 2D index to linear triu index for N by N array"""
    return N * i - ((i - 1) * i) // 2 + (j - i)

def test(N):
    """Make sure my `mkinds` works for given N"""
    arr = mksquare(N)
    vec = arr[np.triu_indices(N)]

    inds = mkinds(N)
    expected = [arr[i, j] for (i, j) in inds]

    actual = [vec[ij2linear(i, j, N)] for (i, j) in inds]

    return np.all(np.equal(actual, expected))

"""Run `test` for a bunch of `N`s and make sure they're all right"""
print(all(map(test, range(2, 20))))
# prints True ?

值得发表一篇博文来解释如何得出这个结论,但现在就可以了 ?。

【讨论】:

【参考方案2】:

我找到了答案!它是:

index = (n*(n+1)/2) - (n-i)*((n-i)+1)/2 + j - i

【讨论】:

【参考方案3】:

三角矩阵可以推广到任何维度。例如,假设 A[a,b,c,d,e] 仅当 0

其中 B[b] = b+1 选择 2,C[c] = c+2 选择 3,D[d] = d+3 选择 4 和 E[e] = e +4 选择 5。

这些“偏移”数组可以在不使用乘法或除法的情况下计算,如下所示:

B[0] = C[0] = D[0] = E[0] = 0;

for(int t = 1; t < N; t++)
 
  B[t] = B[t-1]+t;
  C[t] = C[t-1]+B[t];
  D[t] = D[t-1]+C[t];
  E[t] = E[t-1]+D[t];
 

【讨论】:

以上是关于从下/上三角矩阵中给出一个元素的主要内容,如果未能解决你的问题,请参考以下文章

7-1 判断上三角矩阵 (15 分)

判断上三角行列式

第3周

[PTA]习题7-3 判断上三角矩阵

[PTA]习题7-3 判断上三角矩阵

[PTA]实验7-2-5 判断上三角矩阵