C语言中的矩阵表示
我想找出在C语言中m x n实矩阵的最佳表示形式 矩阵表示作为单个指针有哪些优点:C语言中的矩阵表示,c,matrix,matrix-multiplication,C,Matrix,Matrix Multiplication,我想找出在C语言中m x n实矩阵的最佳表示形式 矩阵表示作为单个指针有哪些优点: double* A; double** B; 使用此表示法,您可以分配内存: A = (double* )malloc(m * n * sizeof(double)); 在这种表示中,矩阵访问需要额外的乘法: aij = A[i * m + j]; 矩阵表示法作为双指针有哪些缺点: double* A; double** B; 内存分配需要一个循环: double** B = (double **)
double* A;
double** B;
使用此表示法,您可以分配内存:
A = (double* )malloc(m * n * sizeof(double));
在这种表示中,矩阵访问需要额外的乘法:
aij = A[i * m + j];
矩阵表示法作为双指针有哪些缺点:
double* A;
double** B;
内存分配需要一个循环:
double** B = (double **) malloc(m * sizeof(double*));
for (i = 0; i < m; i++)
A[i] = (double *) malloc(n * sizeof(double))
我正在寻找表示矩阵的最佳方法。如果有其他有效的方法用C表示矩阵,请告诉我
我看到大多数人使用单指针表示。我想知道与双数组表示相比,是否有一些性能优势?查看所需的内存访问 对于单指针情况,您有:
数组[i*m+j]
,4个值是i
、m
、j
和sizeof(数组[0])
在我的大纲中,你可以挑剔细节,有些“乘法”运算可能是移位运算等,但一般的概念仍然是:双指针需要两次内存访问,而单指针解决方案需要一次内存访问,这会更慢。这里有几篇关于行主格式的文章
这些是CUDA编程中的常见结构;因此,我很感兴趣。您缺少访问矩阵中特定数字并分配矩阵本身的示例代码,因此无法说出您所指的矩阵表示。(不是我投了反对票。)你能告诉我这是否更好,或者我应该删除这个问题吗?在第二种情况下,你可以将Malloc的数量减少到2个甚至1个。也就是说,您可以将一个大的
double*
块(与第一个变量中的长度相同)分配给A[0]=malloc\u结果
,A[1]=malloc\u结果+n
,A[2]=malloc\u结果+2*n
等等(假设malloc\u结果的类型为double*
)。使用一个malloc,您分配sizeof(double*)*m+sizeof(double)*n*m
,并分配A=malloc\u结果,A[0]=(double*)(malloc\u结果+m)
,A[1]=A[0]+n
,A[2]=A[1]+n
等等(假设malloc结果的类型为(double**)。没有必要进行m+1分配。尽管这些变体有一个缺点,即valgrind
无法检测越界数组访问:因为a[0][n]
只是a[1][0]
尝试分配给它并不是一个错误。