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