2010-10-06 80 views
3

我正在尝试使用循环平铺技术来编写一个旋转图像矩阵的函数。但是,我遇到了一些使其正常工作的问题。编辑: 这是我的更新代码,但只有当n是块大小的倍数。我将如何去处理不同的矩阵大小?现在,我只是使用方块,对于那些方块来说效果很好。我将如何去改变这个使用基于我给出的数组大小的矩形块。具体来说,如果我得到一个n×n的数组,我该如何选择矩形块的尺寸来将其分解成?循环平铺旋转矩阵

//Block size to tune 
    int block = 20; 
    int i1, j1, k1, i, j, k; 

    for(i1 = 0; i1 < n; i1 += block) { 
    for(j1 = 0; j1< n; j1 += block) { 
      for(i = i1; i < i1 + block; i++){ 
       for(j = j1; j < j1 + block; j++){ 
        dest[getInd(j, i, n)] = src[getInd(i, n - 1 - j, n)]; 

       } 
      } 
     } 
    } 

}

+2

好......问题在哪里? *你得到了什么结果? – 2010-10-06 20:32:16

+0

在顶部添加原始矩阵的结果图像,在底部不正确地旋转。 – CCSab 2010-10-06 20:40:53

+0

+1循环平铺! – 2010-10-06 20:45:19

回答

1

前两个for循环看上去是错误的:

for(i1 = 0; i1 < n/block; i1 += block) { 
    for(j1 = 0; j1< n/block; j1 += block) { 

也许应该是:

for(i1 = 0; i1 < n; i1 += block) { 
    for(j1 = 0; j1 < n; j1 += block) { 

这项步骤纠正虽然你可能只需要一步通过调试器中的代码来确定还需要修复哪些内容。

+0

我做了这个改变,并且摆脱了k循环,而只是使用n作为我的行的跨步(我不确定)。这样做和更改块大小使我的代码运行,但仅限于某些矩阵。例如,如果矩阵的大小是我的块大小的倍数,我的代码才能正常工作。我将如何去处理这件事? – CCSab 2010-10-06 20:56:47

+0

我怀疑你可能只需要接受'n'需要是'block'整数倍的限制。如果它有一些奇怪的(主要)尺寸,你可以随时放置你的图像以满足这个限制。 – 2010-10-06 22:05:17