9

このパターンに従う線形インデックスを使用して行列にアクセスできます

0 1 2

3 4 5

6 7 8

この場合の i,j 座標を取得するのは簡単です (n は行列の次元です)。0 インデックス ベースの場合は、次のようになります。

i = インデックス / n

j = インデックス % n

さて、行列が対称で、上部のみにアクセスしたい場合はどうなりますか

0 1 2 3

.. 4 5 6

..... 7 8

..........9

線形インデックスは次の式で与えられることを知っています

インデックス = j + n*i - i (i-1) / 2

しかし、与えられたidxのi、jを知りたいです。これを行う方法を知っていますか?こちらで調べてみましたが、答えが見つかりませんでした。前もって感謝します。

4

8 に答える 8

4

まだ誰も Matlab ソリューションを投稿していないので、ここに簡単なワンライナーを示します。

idxs = find(triu(true(size(A))))

matrixを指定Aすると、これはすべてのインデックスのベクトルをidxs(k)返します。これにより、k 番目の線形インデックスが行列の上三角部分に返されます。

于 2013-10-02T18:51:47.390 に答える
1

各行のオフセットと各行の開始インデックスを追跡しながら、行をループします。

offset = 0;
startOfRow = 0;
for(i=0;i<height;i++){
    endOfRow = startOfRow + (width - offset);
    if(idx < endOfRow){ 
        j = (idx - endOfRow) + width;
        return {i,j};
    } else {                           
        startOfRow = endOfRow;
        offset++;
    }
}

私は Matlab を知らないので、単なる疑似コードですが、動作するはずです。horchler が言うように、索引付けが正しいことを確認してください。i,jあなたの例で使用したようにここで使用しましたが、私には奇妙に感じます。

于 2013-10-02T18:30:03.360 に答える
0

これが私が考えることができる最も簡単な方法です:

int i = 1, j, x=n;
while (idx > x)
{
    i++;
    idx=idx-x;
    x--;
}
j=idx+(i-1);

return i, j;
于 2013-10-02T18:47:56.197 に答える
0

0 インデックス ベースの場合:

int j = 0;
int x = (n-1);
while (idx > x) {
    j++;
    idx=idx-x;
    x--;
}
i=idx;
于 2014-05-16T20:58:05.177 に答える