有效地交换子矩阵中的数据

时间:2015-12-22 00:57:48

标签: c# matrix swap

我需要使用C#交换矩阵中的数据。你可以想象这个交换就像在矩阵转置中一样。

| a11 a21 |   --->  | a11 a12 |
| a12 a22 |         | a21 a22 |

我为此目的编写了这段代码;

  public void SwapSubMatrix(int xStart, int yStart, int size)
  {

       for (int i = xStart; i < xStart + size; i++)
       {
            for (int j = yStart; j < yStart + size; j++)
            {

                  this.temp = this.matrix[i, j];
                  this.matrix[i, j] = this.matrix[i - size, j + size];
                  this.matrix[i - size, j + size] = this.temp;
            }
       }
   }

基本上,我传递a21's column and row position and the size of the it,然后更改a21a12之间的值

它完全有效,但我想知道还有另一种方法可以快速完成。因为在我的情况下甚至毫秒都是如此重要。如果有另一种方法可以有效地使用缓存或者使用辅助函数来执行此操作(例如memcpy或者像C中的那样),我想知道。

1 个答案:

答案 0 :(得分:1)

你可以通过循环一半矩阵来减少一半以上的工作,因为你只需要一步处理两个单元格,你就不需要改变对角线上的任何东西:

  public void TransposeMatrix(int xStart, int yStart, int size)
  {
    int i = xStart, j = yStart;
    while (j < yStart + size)
    {
        this.temp = this.matrix[i, j];
        this.matrix[i,j] = this.matrix[j, i];
        this.matrix[j, i] = this.temp;
        i++;
        if (i >= j)
        {
            j++;
            i = xStart;
        }       
    }
  }

所以5x5矩阵只需要11个循环和500x500矩阵124751步而不是250000

现在,如果你真的需要经常这样做,你可以并行化调用,例如:

    Parallel.ForEach(MyArrayOfMatrices, MyMatrix =>
    {
         MyMatrix.TransposeMatrix(0, 0, 500);
    });