使用二维数组,我想找到一种方法来避免实际交换矩阵的行,只是改变行的索引。我找到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},
};
答案 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/buffer和https://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
。