2016-09-30 102 views
0

我有矩阵的上三角部分,主对角线存储为线性阵列,矩阵元素的(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). 

Regards,

+0

听起来像一个功课问题。你有什么尝试?它产生了什么结果?你可以修改一个没有主对角线的主要对角线吗? – mkasberg

+0

我试过这个没有对角线:k =(n *(n-1)/ 2) - (ni)*((ni)-1)/ 2 + j - i - 1 具有对角线的三角形:((I + 1)* I/2 + J)。 – Bako

+0

@Bako你可以在你的问题中加入你已经使用的代码。你在这里提供的是逻辑,并不是每个人都看到评论。所以,请编辑该问题。 –

回答

0

我的解决方案可能是相当于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 

值得一个博客文章解释如何得出这个结论,但这会做现在。

0

我想出了答案!它是:

index = (n*(n+1)/2) - (n-i)*((n-i)+1)/2 + j - i 
相关问题