将二维矩阵映射到一维数组
Map 2D matrix to 1D array
我有两个容器:一个二维NxN矩阵和一个一维数组,它是矩阵的转置1D"版本"(因此对于5x5数组,我将有一个具有相同值的25个元素数组)。我想实现一个查询函数,将2D坐标作为参数,但将在等效的1D数组上做工作。
为了保证算法的效率严格是非二次型的,我想只访问数组而不访问矩阵。
我检查了其他问题,但他们都在谈论通过嵌套的for循环将整个矩阵转换为数组。我不想这样做,因为那样会花费2倍的时间。相反,我希望通过查询函数/方法对给定坐标按需进行转换。换句话说,对于给定数目的N列/行:
transpose(int i, int j) {
int result;
result = i * N + j;
return result;
}
这是我使用的公式,但它是不正确的。例如,如果我想访问{5,5}位置的元素,结果将是5*5 + 5 = 30,这大于25(这将是5x5矩阵的元素总数)。
如果您有一个2d
数组和一个1d
数组具有相同的元素,那么以下将为真
2d[i][j]=1d[i*number_of_columns+j]
我从你的帖子中假设你已经创建了一个2d数组的1d数组。注:i
和j
是索引,索引从0
编辑:如果您正在访问[5][5]
(作为最后一个元素)的元素,这意味着您的数组的顺序是6 by 6
而不是5 by 5
。因此,您的1d数组将具有6*6=36
元素而不是25
。
您可以使用deepToString()
方法将2D数组输出到String。这可以使诸如sort()
之类的事情更容易执行。
假设声明的int mat2d[m][n];
具有m
行和n
列,您可以将其转换为
int * mat1d = new int[m * n];
int k = 0;
for (int i = 0; i < m; ++i)
for (int j = 0; j < n; ++i)
mat1d[k++] = mat2d[i][j];
如果您只想在1D和2D坐标之间进行转换,请自己服务并从中生成函数:
const int width = 10;
// from 1D coordinate to 2D coordinate
int coord_1d = 25;
int coord_x = coord_1d % width;
int coord_y = coord_1d / width;
// from 2D coordinate to 1D coordinate
coord_1d = coord_x + coord_y * width;
你的问题很令人困惑,你说你不想要嵌套循环,这里是一个只有一个循环的转换
int[][] a={
{1,2,3,4,5,6},
{4,5,6,7,8,9},
{7,8,9,1,2,3},
{1,2,3,4,5,6}
};
int[]b=new int[a.length*a[0].length];
int x=0;
for(int i=0, j=0;i<a.length&&j<a[0].length;i=(j==a[0].length-1?i+1:i),j=(j+1)%a[0].length)
b[x++]=a[i][j];
System.out.println(Arrays.toString(b));
如果你想转换为基于坐标,通过改变i
和j
的值在for循环为这样的坐标将允许你转换为数组矩阵的一个子集
相关文章:
- 将二维数组的所有元素插入到一维数组中
- C++语法差异:二维和一维数组(指针算术)
- 将一维数组写入 CSV C++中的不同列?
- C++:将矩阵存储在一维数组中
- 如何在一维数组中的每个元素中都有多个int值
- 以C++填充一维数组
- 用于在一维数组上嵌套循环操作的正确 openmp 指令
- 如何在 <threads> c++ 中使用和一维数组进行矩阵乘法?
- C++按内存地址将多维数组更改为一维数组
- 在 c++ 中返回一维数组时出错
- 一维数组映射方式的性能差异问题
- 如何使用一维数组更改二维数组中的值?
- 使用二维数组作为一维数组是否正确?可能会导致未定义的行为左右?
- 将一维数组转换为二维数组
- 如何使用一维数组列表初始化二维数组
- 在一维数组中对二维进行排序
- 将一维数组的索引转换为二维数组
- 通过访问二维数组实现双线性插值的概念类似于一维数组
- 将二维矩阵映射到一维数组
- 如何将矩阵的索引映射到一维数组(c++)