我希望找到在C编程语言中表示m x n实数矩阵的最佳方法。
使用单个指针表示矩阵有什么优点:
double* A;
使用这种表示法,您可以分配内存:
A = (double* )malloc(m * n * sizeof(double));
在这种表示中,矩阵访问需要进行额外的乘法操作:
aij = A[i * m + j];
矩阵表示法作为双指针的缺点有哪些:
double** B;
内存分配需要进行循环:
double** B = (double **) malloc(m * sizeof(double*));
for (i = 0; i < m; i++)
A[i] = (double *) malloc(n * sizeof(double))
在这种表示法中,您可以使用直观的双索引 `bij = B[i][j]`,但是否存在会影响性能的缺点。我想知道在性能方面什么是最好的表示方法。
这些矩阵应该用于数值算法,例如奇异值分解。我需要定义一个函数:
void svd(Matrix A, Matrix U, Matrix Sigma, Matrix V);
我希望您能帮忙翻译一下关于IT技术的内容,这段话需要讲述如何更好地表述矩阵。如果C语言中有其他更有效的方法来表示矩阵,请告诉我。
我发现大多数人使用单指针表示法。我想知道相对于双数组表示法是否有性能上的优势?
double *
块(与第一种变体相同长度),并分配A [0] = malloc_result
,A [1] = malloc_result + n
,A [2] = malloc_result + 2 * n
等(假设malloc_result
的类型为double *
)。通过一次malloc,您可以分配sizeof(double *)* m + sizeof(double)* n * m
,并分配A = malloc_result
,A [0] =(double *)(malloc_result + m)
,A [1] = A [0] + n
,A [2] = A [1] + n
等(假设malloc_result
的类型为(double **)
)。没有必要进行m + 1次分配。 - ZyXvalgrind
无法检测到越界数组访问:因为A[0][n]
只是A[1][0]
,所以试图对其进行赋值不会报错。 - ZyX