Algorithm 如何将二维矩阵项映射到一维数组;指针数组;间接的?

Algorithm 如何将二维矩阵项映射到一维数组;指针数组;间接的?,algorithm,sparse-matrix,adjacency-matrix,Algorithm,Sparse Matrix,Adjacency Matrix,注意:我编辑了这个问题,并提供了和的有用反馈。 我有一个想法,使用1D数组在特定处理上下文中缓存最常用的2D NxM矩阵项。问题是,是否已经有一系列的工作可以从哪里获得洞察力,或者只有人知道。我将首先概述腿部工作,然后再问这个问题。作为一个已经提出的补充说明,它从概念上看是我所追求的东西,但不会很容易回答我的具体问题(即,我找不到一条曲线来做我所追求的东西) 腿部工作: 目前,使用最多的条目被定义为循环和特殊的指针数组的组合(参见下面的代码),组合起来生成使用最多的矩阵元素的索引。指针数组包含数

注意:我编辑了这个问题,并提供了和的有用反馈。

我有一个想法,使用1D数组在特定处理上下文中缓存最常用的2D NxM矩阵项。问题是,是否已经有一系列的工作可以从哪里获得洞察力,或者只有人知道。我将首先概述腿部工作,然后再问这个问题。作为一个已经提出的补充说明,它从概念上看是我所追求的东西,但不会很容易回答我的具体问题(即,我找不到一条曲线来做我所追求的东西)

腿部工作: 目前,使用最多的条目被定义为循环和特殊的
指针数组的组合(参见下面的代码),组合起来生成使用最多的矩阵元素的索引。指针数组包含数字[0,max(N,M)](参见上面定义为NxM的矩阵维度)

代码的目的是生成适当的(在程序上下文中)索引组合,以处理一些矩阵条目。有可能N=M,也就是一个方阵。遍历矩阵的代码(C++)如下所示

for(int i = 0; i < N; i++)
{        
    for(int j = i + 1; j < M; j++)
    {
        auto pointer1 = pointer_array[i];
        auto pointer2 = pointer_array[i + 1];
        auto pointer3 = pointer_array[j];
        auto pointer4 = pointer_array[j + 1];

        auto entry1 = some_matrix[pointer1][pointer3];
        auto entry2 = some_matrix[pointer2][pointer4];
        auto entry3 = some_matrix[pointer3][pointer4];
        auto entry4 = some_matrix[pointer1][pointer2];

        //Computing with the entries...
    }
}
或者像下面这样的事情也可以

for (int i = 0; i < N; i++)
{        
    for (int j = i + 1; j < M; j++)
    {            
        auto pointer1 = pointer_array[i];
        auto pointer2 = pointer_array[i + 1];
        auto pointer3 = pointer_array[j];
        auto pointer4 = pointer_array[j + 1];

        //The some_1d_cache((x, y) call will calculate an index to the 1D cache array...
        auto entry1 = some_1d_cache(pointer1, pointer3);
        auto entry2 = some_1d_cache(pointer2, pointer4);
        auto entry3 = some_1d_cache(pointer3, pointer4);
        auto entry4 = some_1d_cache(pointer1, pointer2);

        //Computing with the entries...
    }
}
for(int i=0;i
你可以用一维空间填充曲线索引二维矩阵。从数学上讲,它是H(x,y)=(H(x)*H(y))。它们也很有用,因为它们基本上是对平面进行细分、存储局部信息和重新排序。

你可以用一维空间填充曲线索引二维矩阵。从数学上讲,它是H(x,y)=(H(x)*H(y))。它们也很有用,因为它们基本上是对平面进行细分、存储一些局部信息和重新排序的。

恐怕这个问题很难回答。你到底想缓存什么?矩阵的一部分?如果是的话,那么访问模式是什么?显然,如果我只是浏览整个矩阵,缓存根本没有任何帮助。Keith,是的,我正在尝试缓存矩阵的一部分。要缓存的部分由指针数组中的索引指向。访问模式是循环中描述的模式。因此,您正在尝试缓存NxM矩阵的上三角部分?任何缓存,您的意思是分配给连续的内存块?是的,我的目标是分配连续的内存块y、 由于(目前认为)简单性,我的目标主要是一维数组。我不想缓存矩阵的上三角部分,但循环索引提供指向指针数组的索引,指针数组反过来包含所需的矩阵索引。调用可能类似于某个_矩阵[0][10]和某个_矩阵[10][0]在同一次运行期间,我将编辑有关此问题的问题(并修复那里的索引条件错误)。对不起,我放弃了。我仍然不明白这一切的意义何在。也许你要用简单的行主布局编写循环?或者这是你的第一个代码段?但是为什么你的第一个代码段不仅仅做
auto entry1=some_matrix[I][j]
?指针数组的意义是什么?
?它是否将条目别名化到同一个存储?恐怕这个问题很神秘。你到底想缓存什么?矩阵的部分?如果是,那么访问模式是什么?显然,如果我只是浏览整个矩阵,缓存根本没有任何帮助。基思,是的,我正在尝试正在缓存矩阵的一部分。要缓存的部分由指针数组中的索引指向。访问模式是循环中描述的模式。因此,您尝试缓存NxM矩阵的上三角部分?任何缓存,您的意思是分配给连续的内存块?是的,我的目标是分配连续的内存块,主要是由于(目前认为)简单性,1D数组是我的目标。我不尝试缓存矩阵的上三角部分,但循环索引提供指向指针数组的索引,指针数组又包含所需的矩阵索引。调用可能类似于某个_矩阵[0][10]和某个_矩阵[10][0]在同一次运行期间,我将编辑有关此问题的问题(并修复那里的索引条件错误)。对不起,我放弃了。我仍然不明白这一切的意义何在。也许你要用简单的行主布局编写循环?或者这是你的第一个代码段?但是为什么你的第一个代码段不仅仅做
auto entry1=some_matrix[I][j]
?指针数组的意义是什么?它是将条目别名化到同一个存储中吗?嘿,Chiyou,这是一个有用的指针,肯定可以用于搜索引擎。我将在本周更仔细地研究这一思路。嘿,Chiyou,这是一个有用的指针,肯定可以用于搜索引擎。我将举一个例子在这一周里,我会更仔细地挖掘这一思路。
for (int i = 0; i < N; i++)
{        
    for (int j = i + 1; j < M; j++)
    {            
        auto pointer1 = pointer_array[i];
        auto pointer2 = pointer_array[i + 1];
        auto pointer3 = pointer_array[j];
        auto pointer4 = pointer_array[j + 1];

        //The some_1d_cache((x, y) call will calculate an index to the 1D cache array...
        auto entry1 = some_1d_cache(pointer1, pointer3);
        auto entry2 = some_1d_cache(pointer2, pointer4);
        auto entry3 = some_1d_cache(pointer3, pointer4);
        auto entry4 = some_1d_cache(pointer1, pointer2);

        //Computing with the entries...
    }
}