交换矩阵行的最佳方法是什么?

时间:2015-09-16 00:01:13

标签: c# arrays multidimensional-array

使用二维数组,我想找到一种方法来避免实际交换矩阵的行,只是改变行的索引。我找到this question,但答案包括交换行,似乎需要花费同样多的时间。

如果没有任何方法可以更改索引,那么您建议采用哪种其他方式来减少行/列交换的时间?

PS。 这就是我定义矩阵的方式:

float[,] Ab = new float[,] 
            {
            {1,4,-2,104},
            {3,5,100,90},
            {2,-3,48,2},
            };

我希望它按照这样的矢量排序:[3 2 1],结果将是

Ab =    {
        {2,-3,48,2},
        {3,5,100,90},
        {1,4,-2,104},     
        };

2 个答案:

答案 0 :(得分:2)

锯齿状数组通常更快,所以你可能想要切换到它们,但这里是如何交换矩形数组中的行:

的间接!

  

“计算机科学中的每个问题都可以通过引入另一层间接来解决。”

int[] rowInd = { 3, 2, 1 };

从现在开始,您可以访问

matrix[rowInd[i]-1, j] // take out the "-1" if you use zero-based numbering

而不是

matrix[i,j]

交换行只涉及更改rowInd

作为奖励,此方法也适用于交换列,并且仍可用于交换锯齿状数组中的列:

matrixJagged[i][colInd[j]]

答案 1 :(得分:1)

所以,不幸的是,你之前看到的答案是你在这种情况下唯一可以做的,因为你有一个矩形阵列。 (见下面的编辑)。据我所知,您无法在矩形数组中自行索引到特定行。

使用锯齿状阵列,您可以轻松完成:

var Ab = new[]
{
    new float[] {1,4,-2,104},
    new float[] {3,5,100,90},
    new float[] {2,-3,48,2}
};

// Example swap (rows 0 and 1).
var temp = Ab[0];
Ab[0] = Ab[1];
Ab[1] = temp;

修改

我能够想出一种方法来交换矩形阵列中的行(基于http://www.dotnetperls.com/bufferhttps://msdn.microsoft.com/en-us/library/system.buffer.blockcopy(v=vs.110).aspx)。

var Ab = new float[,]
{
    {1, 4, -2, 104},
    {3, 5, 100, 90},
    {2, -3, 48, 2}
};

// Size of float.
var floatSize = sizeof (float);

// Number of elements in a row.
var numRowElements = 4;

// Temporary array for an intermediate step in the swap operation.
var temp = new float[numRowElements];

// Copy first row into a temporary array.
System.Buffer.BlockCopy(Ab, 0, temp, 0, numRowElements*floatSize);

// Copy second row into the first row.
System.Buffer.BlockCopy(Ab, numRowElements*floatSize, Ab, 0, numRowElements*floatSize);

// Copy temporary array into the second row.
System.Buffer.BlockCopy(temp, 0, Ab, numRowElements*floatSize, numRowElements*floatSize);

现在,我使用了float,因为这是你在原帖中所拥有的,但我没有看到你的数组中使用了浮点数。因此,如果你坚持使用整数值,我建议使用int代替float