Matrix C语言中的优化矩阵计算
我试图找到用转置乘矩阵的最有效方法。关于最有效的数学公式有什么想法吗?您可以通过在相同的Matrix C语言中的优化矩阵计算,matrix,Matrix,我试图找到用转置乘矩阵的最有效方法。关于最有效的数学公式有什么想法吗?您可以通过在相同的for循环中初始化A和B矩阵来改进您的第一个解决方案 n*k也会计算两次,您可以将其存储到变量中以节省一些时间 最好使用B[i+n*j]+=…而不是B[i+n*j]=B[i+n*j]+…,因为在第一种方法中,B[i+n*j]被读取一次,而在第二种方法中被读取两次 void print_unmodified() { unsigned int n = 64u; unsigned int A[N_M
for
循环中初始化A
和B
矩阵来改进您的第一个解决方案
n*k
也会计算两次,您可以将其存储到变量中以节省一些时间
最好使用B[i+n*j]+=…
而不是B[i+n*j]=B[i+n*j]+…
,因为在第一种方法中,B[i+n*j]
被读取一次,而在第二种方法中被读取两次
void print_unmodified()
{
unsigned int n = 64u;
unsigned int A[N_MAX];
unsigned int B[N_MAX];
/* Initializing the A and B matrix with values 1->64^2 */
for (int i = 0; i < (n * n); i++)
{
A[i] = i + 1;
B[i] = 0u;
}
/* Matrix Multiplication B = A*A' */
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
int index = i + n*j;
for (int k = 0; k < n; k++)
{
int p = n * k;
B[index] += A[i + p] * A[j + p];
}
}
}
}
void print_unmodified()
{
无符号整数n=64u;
无符号整数A[N_MAX];
无符号整数B[N_MAX];
/*使用值1->64^2初始化A和B矩阵*/
对于(int i=0;i<(n*n);i++)
{
A[i]=i+1;
B[i]=0u;
}
/*矩阵乘法B=A*A'*/
对于(int i=0;i
发布的代码给出了正确的答案,一个矩阵B,它是另一个矩阵a的转置产物,但两个矩阵都以列的主次顺序存储在两个数组中(或者至少,OP在评论中是这样说的)
考虑到这个片段:
for(int i=0;i
我们可以注意到,内部循环每次都会跳过n
元素遍历这些数组,这不利于缓存
如果我们安排循环的顺序,使内部循环在连续元素上迭代,我们可以获得性能增益:
//计算矩阵B=A乘以A的转置。A是一个nxn矩阵。
//A和B以列主顺序存储在普通数组(“src”和“dest”)中
无效多重(大小、值常量*src、值常量*dest)
{
对于(大小i=0,end=n*n;i 对于(大小k=0;k