【问题标题】:Matrix calculation矩阵计算
【发布时间】:2011-07-18 11:20:16
【问题描述】:

我有一个大的 2D 矩阵 A2D,其列秩和行秩始终相等,并除以 4。我想将列秩和行秩都降低到各自的四分之一 (1/4)形成另一个矩阵B2D。每个 B2D 元素是 A2D 的 4x4 子矩阵的平均值。为了清楚说明我想要做什么,我以一个简单的 8x8 矩阵为例,并提供以下代码 sn-p 供您参考。我的解决方案非常笨拙。请您向我展示另一个性能更好的解决方案。提前谢谢你。

int arr[8][8] =     
{   
   {11, 12, 13, 14, 15, 16, 17, 18}, 
   {21, 22, 23, 24, 25, 26, 27, 28},
   {31, 32, 33, 34, 35, 36, 37, 38},
   {41, 42, 43, 44, 45, 46, 47, 48},
   {51, 52, 53, 54, 55, 56, 57, 58},
   {61, 62, 63, 64, 65, 66, 67, 68},
   {71, 72, 73, 74, 75, 76, 77, 78},
   {81, 82, 83, 84, 85, 86, 87, 88}
};

int** pColAvg = new int* [8];

for (int i = 0; i < 8; i++)
    pColAvg[i] = new int[2];

for (int nRow = 0; nRow < 8; nRow + 4)
{   
    for (int nCol = 0; nCol < 8; nCol + 4)
    {  
        int Avg = 0;
        Avg += arr[nRow][nCol];
        Avg += arr[nRow][nCol + 1];
        Avg += arr[nRow][nCol + 2];
        Avg += arr[nRow][nCol + 3];
        Avg /= 4;

        pColAvg[nRow][nCol/4] = Avg;
    }
}

int** pAvgArray = new int* [2];

for (int i = 0; i < 2; i++)
    pAvgArray[i] = new int[2];

for (int nRow = 0; nRow < 8; nRow + 4)
{    
    for (int nCol = 0; nCol < 2; nCol++)
    {   
        int Avg = 0;
        Avg += pColAvg[nRow][nCol];
        Avg += pColAvg[nRow + 1][nCol];
        Avg += pColAvg[nRow + 2][nCol];
        Avg += pColAvg[nRow + 3][nCol];
        Avg /= 4;

        pAvgArray[nRow/4][nCol] = Avg;
    }
}

for (int i = 0; i < 8; i++)     
    delete [] pColAvg[i]; 

delete [] pColAvg; 

for (int i = 0; i < 2; i++)     
    delete [] pAvgArray[i]; 

delete [] pAvgArray; 

【问题讨论】:

  • 我想你的意思是大小而不是等级,因为在谈到矩阵(顺便说一下,它总是二维的)时,等级意味着不同的东西。否则说二维数组。

标签: c++ matrix average


【解决方案1】:

我认为您的解决方案可能不正确(即使您的平均数是指精确平均数的下限)。这是我的解决方案:

int** solveIt(int **arr, int n){
    int **result = new int*[n/4];
    for(int i=0; i<n; i+=4){
        result[i] = new int[n/4];
        for(int j=0; j<n; j+=4){
            int sum = 0;
            for(int k=0; k<4; k++)
                for(int q=0; q<4; q++)
                    sum += arr[i+k][j+q];
            result[i/4][j/4] = sum/16;
        }
    }
    return result;
}

这是一个函数,它接受数组和该数组的大小,并返回结果数组。

编辑: 以及您的解决方案不起作用的示例:

1 1 1 1
1 1 1 2
1 1 1 1
1 1 0 1

答案是:

1

但您的解决方案会给出:

0

【讨论】:

  • 谢谢!我确定您的解决方案是否适合我。我的遥感仪器有探测器。每个探测器在一个时间间隔内可以扫描2500条线,每条扫描线有10000个像素。用户可以结合 4 个探测器的观察结果来制作高分辨率 (10000x10000) 图像。另一方面,用户也可以通过平均四个观察值来获得较低的结果(2500x2500)。
  • 我的条件是:我已经有了高分辨率矩阵。我想推导出另一个低分辨率的。
猜你喜欢
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 2012-10-01
  • 2019-11-06
相关资源
最近更新 更多