【发布时间】:2017-03-16 19:54:51
【问题描述】:
假设我有一个大小为n 的方阵A,定义为std::vector<double>。
std::vector<double> A(n*n);
矩阵的元素按通常的方式访问:
double a_ij = A[i*n + j];
我需要相对于第一列按升序对矩阵的行进行排序。
qsort 函数允许我使用数组和函数指针来完成此操作,但我想找到一种方法来使用向量和std::sort 来完成此操作。
另外,请注意,出于性能原因,我不希望将我的矩阵定义为向量向量。
编辑:
我传递给 qsort 的函数:
static int comparisonFunction(const void* firstRow, const void* secondRow)
{
if (((double *)firstRow)[0] < ((double *)secondRow)[0]) return -1;
else if (((double *)secondRow)[0] < ((double *)firstRow)[0]) return 1;
return 0;
}
还有电话:
std::qsort(matrixArray, nbRows, sizeof(double)*nbRows, comparisonFunction);
【问题讨论】:
-
能否详细说明“性能原因”?
-
我需要对排序后的矩阵进行大量计算,因此内存连续性更可取。
-
你需要一个包装器来允许
begin和end遍历行 -
@doctorlove :我添加了一些关于如何让 qsort 工作的精确度。
-
我可能会分两步完成。对包含每行的第一个条目和原始索引的对向量进行排序,然后使用其结果重新排列矩阵。对向量进行排序很快,您可以在排序过程中节省移动整行。