C 矩阵中交换反对称元素

C 矩阵中交换反对称元素,c,matrix,C,Matrix,我试图改变数组元素相对于矩阵中心的反对称位置a(不确定是否这样说),如果要交换的位置构成中心的一部分,则不应执行任何操作(根据矩阵,中心可以是1、2或4个单元格): 中心将是:13 例如,将数字2换成数字24。我想通过计算从中心到元素位置(dx-dy)在x和y上的位移,然后从中心到反对称位置的位移是-dx-dy int mat [][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};

我试图改变数组元素相对于矩阵中心的反对称位置a(不确定是否这样说),如果要交换的位置构成中心的一部分,则不应执行任何操作(根据矩阵,中心可以是1、2或4个单元格):

中心将是:13

例如,将数字2换成数字24。我想通过计算从中心到元素位置(dx-dy)在x和y上的位移,然后从中心到反对称位置的位移是-dx-dy

int mat [][5]={{1,2,3,4,5},{6,7,8,9,10},{11,12,13,14,15},{16,17,18,19,20},{21,22,23,24,25}};
int aux;
int i = 0;
int j = 1;          // i and j are the indeces of the element to be exchanged
int xcenter=col/2;
int ycenter=fil/2;  // xcenter and xcenter are the indeces of the center
int dx = j-xcenter;
int dy = i-ycenter; // dx dy are the displacements
aux=mat[i][j];
mat[i][j]=mat[xcenter-dx][ycenter-dy];
mat[xcenter+dx][ycenter+dy]=aux;
当矩阵有奇数列或奇数行时,我的问题就来了,因为在这种情况下,中心不是一个位置,而是一个集合。例如,该矩阵为5*4

1  2  3   4
5  6  7   8
9  10 11 12
13 14 15 16
17 18 19 20
该中心将是:

10 11

我不知道如何找到中心,以及从中心的哪个元素计算位移。

您可以简化坐标计算,如下所示:

xcenter-dx = xcenter - (j-xcenter) = 2*xcenter - j = 2*col/2 - j = col - j
同样地

xcenter+dx = j
ycenter-dy = fil - i
ycenter+dy = i

因此,将奇数除以2不会有问题。

不清楚要实现什么,或者这是否是编程问题。。只是:这不是正方形与非正方形的问题。但是行/列的奇数与偶数。您也可以将中心定义为
10
11
之间的某个(假设)位置(或者如果“中心”超过两个点,则位于平均位置)。比中心更重要的是,5*4(5行,4列)矩阵中包含2的单元格是否移动到19的位置,反之亦然?同样,包含10和11的单元格不需要交换吗?如果不是,则需要描述5*7、5*8或5*9矩阵(以及4*7、4*8等)的情况。也就是说,更极端的非平方矩阵的行为是什么。如果有一个矩阵有
行和
cols
列,并且在行
r
处有一个元素(
r
r>=0
),列
c
c
c>=0
),那么反对称元素不是总是在第
(rows-1-r)
,第
(cols-1-c)
列吗?只有当
都是奇数时,才有一个“中心”单元格(在行
r
r==rows-r-1
,列
c
c==cols-c-1
)。在最后一个矩阵示例中,元素10和11将彼此反对称。如果不是,为什么不呢?是的,你是对的。也许我不理解这个问题,我必须交换每个元素,除非行和列是奇数。
xcenter+dx = j
ycenter-dy = fil - i
ycenter+dy = i