1

行列の上三角部分があり、主対角が線形配列として格納されています。行列要素の (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).

よろしく、

4

3 に答える 3

1

私の解決策はあなたのものと同等かもしれませんが、私はチェックしていません:

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

これは完全な Python テストです。Numpy には がtriu_indicesあり、上三角インデックスが得られるため、Python を使用しました。

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 

この結論に到達する方法を説明するブログ投稿の価値はありますが、今のところはこれで十分です。

于 2016-09-30T16:44:06.760 に答える
0

答えがわかった!それは:

index = (n*(n+1)/2) - (n-i)*((n-i)+1)/2 + j - i
于 2016-09-30T16:04:10.627 に答える