Algorithm 将矩阵转化为向量

Algorithm 将矩阵转化为向量,algorithm,math,Algorithm,Math,这可能更像是一个数学问题,但它用于代码中 假设有一个nxn网格或矩阵。如果你想以某种方式拉伸它,把它变成一个排序数组,这样现在每个元素都在彼此的右边或左边,就像在向量中一样。但您希望通过原始引用(即行和列)继续引用每个元素。您要做的是将它在向量中的索引除以N。它的行是index//N,列是index%N 我的问题是:如果网格是nx M,导致一个大小为N*M的数组,那么如何获得网格中每个元素的相应位置?这种拉伸称为展平。这几乎总是按行主顺序或列主顺序进行。行主样式也称为C样式,列主样式称为Fort

这可能更像是一个数学问题,但它用于代码中

假设有一个nxn网格或矩阵。如果你想以某种方式拉伸它,把它变成一个排序数组,这样现在每个元素都在彼此的右边或左边,就像在向量中一样。但您希望通过原始引用(即行和列)继续引用每个元素。您要做的是将它在向量中的索引除以N。它的行是index//N,列是index%N


我的问题是:如果网格是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。仔细阅读我的答案。