Algorithm 将矩阵转化为向量
这可能更像是一个数学问题,但它用于代码中 假设有一个nxn网格或矩阵。如果你想以某种方式拉伸它,把它变成一个排序数组,这样现在每个元素都在彼此的右边或左边,就像在向量中一样。但您希望通过原始引用(即行和列)继续引用每个元素。您要做的是将它在向量中的索引除以N。它的行是index//N,列是index%NAlgorithm 将矩阵转化为向量,algorithm,math,Algorithm,Math,这可能更像是一个数学问题,但它用于代码中 假设有一个nxn网格或矩阵。如果你想以某种方式拉伸它,把它变成一个排序数组,这样现在每个元素都在彼此的右边或左边,就像在向量中一样。但您希望通过原始引用(即行和列)继续引用每个元素。您要做的是将它在向量中的索引除以N。它的行是index//N,列是index%N 我的问题是:如果网格是nx M,导致一个大小为N*M的数组,那么如何获得网格中每个元素的相应位置?这种拉伸称为展平。这几乎总是按行主顺序或列主顺序进行。行主样式也称为C样式,列主样式称为Fort
我的问题是:如果网格是nx M,导致一个大小为N*M的数组,那么如何获得网格中每个元素的相应位置?这种拉伸称为展平。这几乎总是按行主顺序或列主顺序进行。行主样式也称为C样式,列主样式称为Fortran样式 假设使用行主顺序展平M x N矩阵,其中M是行数,N是列数,则行主顺序的正确转换表达式为:
col = i % N
row = i / N
-----------
i = row*N + col
对于列主顺序,它们是:
col = i / M
row = i % M
-----------
i = col*M + row
两者都假设i、col和row的索引是从零开始的,并且截断除法。这种拉伸称为展平。这几乎总是按行主顺序或列主顺序进行。行主样式也称为C样式,列主样式称为Fortran样式 假设使用行主顺序展平M x N矩阵,其中M是行数,N是列数,则行主顺序的正确转换表达式为:
col = i % N
row = i / N
-----------
i = row*N + col
对于列主顺序,它们是:
col = i / M
row = i % M
-----------
i = col*M + row
两者都假设i、col和row的索引是从零开始的,以及截断除法。只需定义一个映射函数,它在NxM矩阵中占据一个位置,并将其转换为向量中的一个位置:
MATRIX CORRESPONDING VECTOR
| 0 1
--|------ 0 1 2 3 4 5
0 | 7 2 -------------
1 | 1 9 => 7 2 1 9 5 6
2 | 5 6
映射函数可以是fx,y=y*N+x
只需定义一个映射函数,它在NxM矩阵中占据一个位置,并将其转换为向量中的一个位置:
MATRIX CORRESPONDING VECTOR
| 0 1
--|------ 0 1 2 3 4 5
0 | 7 2 -------------
1 | 1 9 => 7 2 1 9 5 6
2 | 5 6
映射函数可以是fx,y=y*N+x
我假设“拉伸”是指将行彼此相邻,形成一维向量,如中所示 对于3x4矩阵 将其拉伸为一维向量,如下所示:
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
现在给k一个上面向量中的索引,你如何得到它在nxm网格中对应的i,j
你把它们弄到手了
i = k / M
j = k - i*M
其中M是列数
您可以检查:
对于k=7 a13=>i=7/4=1和j=7-1*4=3=>1,3
对于k=1 a01=>i=1/4=0和j=1-0*4=1=>0,1
对于k=9 a21=>i=9/4=2和j=9-2*4=1=>2,1
Java中的示例代码如下所示:
private static void printPositions(int N, int M) {
int count = 0;
for ( int k = 0; k < N*M; k++ ) {
int i = k/M;
int j = k - i*M;
System.out.print( "(" + i + ", " + j + ")" + " " );
count++;
if ( count == M ) {
System.out.println();
count = 0;
}
}
}
我假设“拉伸”是指将行彼此相邻,形成一维向量,如中所示 对于3x4矩阵 将其拉伸为一维向量,如下所示:
a00 a01 a02 a03 a10 a11 a12 a13 a20 a21 a22 a23
现在给k一个上面向量中的索引,你如何得到它在nxm网格中对应的i,j
你把它们弄到手了
i = k / M
j = k - i*M
其中M是列数
您可以检查:
对于k=7 a13=>i=7/4=1和j=7-1*4=3=>1,3
对于k=1 a01=>i=1/4=0和j=1-0*4=1=>0,1
对于k=9 a21=>i=9/4=2和j=9-2*4=1=>2,1
Java中的示例代码如下所示:
private static void printPositions(int N, int M) {
int count = 0;
for ( int k = 0; k < N*M; k++ ) {
int i = k/M;
int j = k - i*M;
System.out.print( "(" + i + ", " + j + ")" + " " );
count++;
if ( count == M ) {
System.out.println();
count = 0;
}
}
}
嗯,是的。但我真正想知道的是网格不是正方形的情况。要么我没有完全理解,要么你忘了思考。@DanielOscar只有示例图像是正方形,我的回答的其余部分没有假设矩阵是正方形。只是一句警告的话,我在回答中使用了M x N,这是正常的惯例,你在你的问题中使用了N x M。仔细阅读我的答案。嗯,是的。但我真正想知道的是网格不是正方形的情况。要么我没有完全理解,要么你忘了思考。@DanielOscar只有示例图像是正方形,我的回答的其余部分没有假设矩阵是正方形。只是一句警告的话,我在回答中使用了M x N,这是正常的惯例,你在你的问题中使用了N x M。仔细阅读我的答案。