在C中有效地访问矩阵的列

时间:2018-05-16 05:17:05

标签: c arrays

我将Nx x Ny矩阵U存储为长度为Nx*Ny的一维数组。在应用方面,每个条目代表网格点(x_i, y_j)处某些微分方程的解决方案值,尽管我并不认为这很重要。

我对C不是很熟练,但我知道它是行主要的,所以为了避免过多的缓存未命中,最好首先遍历列:

#define U(i,j) U[j+Ny*i]
for (int i=0; i<Nx; ++i)
    for (int j=0; j<Ny; ++j)
        U(i,j) = i*j; // example operation

我的算法要求我做两种不同类型的操作:

  1. 对于i的行U,执行一些计算,输出另一个数组i的行F
  2. 对于j的列U,执行一些计算,输出另一个数组j
  3. 的列G

    其中FG具有相同的长度和&#34;形状&#34;为U。目标是这样的计算步骤:

    #define U(i,j) U[j+Ny*i]
    #define F(i,j) F[j+Ny*i]
    #define G(i,j) G[j+Ny*i]
    
    for (int i; i<Nx; ++i)
        /* use U(i,:) to compute F(i,:); the : is just pseudocode short-hand to indicate an entire column or row */
    
    for (int j; j<Ny; ++j)
        /* use U(:,j) to compute G(:,j) */
    
    for (int i=0; i<Nx; ++i)
        for (int j=0; j<Ny; ++j)
            U(i,j) += F(i,j) + G(i,j); // example computation
    

    我正在努力学习如何有效地进行这种计算。对U行进行操作的步骤似乎很好,但是U列上的操作将非常慢,并且以列方式将值输入G也将慢一点。

    我想到的一种方法涉及同时存储U及其转置,这样U列上的操作可以在UT行上完成。但我必须进行数千次计算步骤,而且显然计算转置会更慢。同样,我可以组装G的转置,以便我只能以行主要方式输入值,但是在步骤U(i,j) += F(i,j) + G(j,i)中,我现在必须得到列 - 明智的G值。

    我应该如何有效地处理这种情况?

0 个答案:

没有答案