2016-09-30 85 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