在C语言中交换一维数组的列/行

在C语言中交换一维数组的列/行,c,arrays,matrix,linear-algebra,C,Arrays,Matrix,Linear Algebra,尝试在一维数组中创建两个矩阵函数(一个交换列,一个交换行)。显然,它们在结构上是相似的 void col_swap(int a[], int col1, int col2, int colSize, int rowSize) { int d[size]; int space = col2 - col1; for (int i = 0; i < rowSize; i++) { for (int j = 0; j < colSize; j++) { if

尝试在一维数组中创建两个矩阵函数(一个交换列,一个交换行)。显然,它们在结构上是相似的

void col_swap(int a[], int col1, int col2, int colSize, int rowSize) {
  int d[size];
  int space = col2 - col1;
  for (int i = 0; i < rowSize; i++) {
    for (int j = 0; j < colSize; j++) {
      if (i == (col1 - 1) || i == (j * (col1-1))) {
        d[i+space] = a[i];
      } else if (i == (col2 - 1) || i == (j * (col2-1))) {
        d[i-space] = a[i];
      } else {
        d[i] = a[i];
      }
    }
    printf("%d  ", d[i]);
      if ((i+1) % colSize == 0) {
          printf("\n");
      }
  }
}
它回来了

1, 3
2, 4
3, 1
4, 2

这比你想象的要容易得多

因此,您需要交换
col1
col2
,这里矩阵有
rowsize
行数和
colsize
列数

void col_swap(int a[], int col1, int col2, int colSize, int rowSize) {
  for(int i=0;i<rowSize;i++){
    int t=a[i*colSize+col1];
    a[i*colSize+col1]=a[i*colSize+col2];
    a[i*colSize+col2]=t; 
  }
}
如果您考虑:

col_互换(a,0,2,3,4)会导致

// 3 2 1
// 6 5 4
// 9 8 7
// 12 11 10
我在代码中使用了0索引。因此,在输入列时要小心

另一项职能是:-

void row_swap(int a[], int row1, int row2, int colSize, int rowSize) {
  for(int i=0;i<colSize;i++){
    swap(&a[colSize*row1+i],&a[row2*colSize+i]); 
  }
}
void行交换(int a[],int row1,int row2,int colSize,int rowSize){

对于(inti=0;i这比你想象的要容易得多

因此,您需要交换
col1
col2
,这里矩阵有
rowsize
行数和
colsize
列数

void col_swap(int a[], int col1, int col2, int colSize, int rowSize) {
  for(int i=0;i<rowSize;i++){
    int t=a[i*colSize+col1];
    a[i*colSize+col1]=a[i*colSize+col2];
    a[i*colSize+col2]=t; 
  }
}
如果您考虑:

col_swap(a,0,2,3,4);
在同一个数组上会导致

// 3 2 1
// 6 5 4
// 9 8 7
// 12 11 10
我在代码中使用了0索引。所以在输入列时要小心

另一项职能是:-

void row_swap(int a[], int row1, int row2, int colSize, int rowSize) {
  for(int i=0;i<colSize;i++){
    swap(&a[colSize*row1+i],&a[row2*colSize+i]); 
  }
}
void行交换(int a[],int row1,int row2,int colSize,int rowSize){

对于(int i=0;i如果使用C99,则指向的指针可以使索引更容易:

void col_swap(int a[], int col1, int col2, int colSize, int rowSize)
{
    // Cast 'a' to a pointer to a variable length array of size 'colSize'
    int (*a2d_matrix)[colSize] = (int (*)[colSize])a;

    // Now we can index into a (through a2d_matrix) as if it really is
    // a 2 dimensional matrix
    for(int r = 0; r < rowSize; r++)
    {
        int temp = a2d_matrix[r][col1];
        a2d_matrix[r][col1] = a2d_matrix[r][col2];
        a2d_matrix[r][col2] = temp; 
    }
}
void col_swap(int a[],int col1,int col2,int colSize,int rowSize)
{
//将“a”强制转换为指向大小为“colSize”的可变长度数组的指针
int(*a2d_矩阵)[colSize]=(int(*)[colSize])a;
//现在我们可以索引到一个(通过一个2d_矩阵)中,就好像它真的是
//二维矩阵
对于(int r=0;r

我经常使用此方法。请注意,这可能适用于C11及更高版本,但C11标准中可变长度数组是可选的。因此,请检查您的编译器对可选C11功能的支持。据我所知,所有主要供应商都支持C11中的VLA。

如果您使用C99,则指向的指针可以使索引更容易:

void col_swap(int a[], int col1, int col2, int colSize, int rowSize)
{
    // Cast 'a' to a pointer to a variable length array of size 'colSize'
    int (*a2d_matrix)[colSize] = (int (*)[colSize])a;

    // Now we can index into a (through a2d_matrix) as if it really is
    // a 2 dimensional matrix
    for(int r = 0; r < rowSize; r++)
    {
        int temp = a2d_matrix[r][col1];
        a2d_matrix[r][col1] = a2d_matrix[r][col2];
        a2d_matrix[r][col2] = temp; 
    }
}
void col_swap(int a[],int col1,int col2,int colSize,int rowSize)
{
//将“a”强制转换为指向大小为“colSize”的可变长度数组的指针
int(*a2d_矩阵)[colSize]=(int(*)[colSize])a;
//现在我们可以索引到一个(通过一个2d_矩阵)中,就好像它真的是
//二维矩阵
对于(int r=0;r


我经常使用这种方法。请注意,这可能适用于C11或更高版本,但C11标准中可变长度数组是可选的。因此,请检查您的编译器对可选C11功能的支持。据我所知,所有主要供应商都支持C11中的VLA。

c
masters可以在这里纠正我的错误,但我非常确定是二维的al array NxM在内存中看起来与NxM维度的一维数组完全相同,因此可以通过两种方式访问(单括号或双括号,在维度内).还有,什么不起作用,你怀疑什么,等等?@kabanus你即将被纠正:你在第一部分是对的,但你的结论是错误的。我仍然想知道人们为什么要使用1d数组来存储矩阵。@FelixPalmen谢谢。这是在编译器中强制执行的吗?我不知道
C
编译器可能是这样的ct.@kabanus不,这使它更成问题,就像许多C代码可能导致未定义的行为一样;)@FelixPalmen啊,这就是它如此可爱的原因。
c
大师可以在这里纠正我的错误,但我非常确定二维数组NxM在内存中看起来与NxM维度一维数组完全相同-因此可以通过两种方式访问(单括号或双括号,在维度内).还有,什么不起作用,你怀疑什么,等等?@kabanus你即将被纠正:你在第一部分是对的,但你的结论是错误的。我仍然想知道人们为什么要使用1d数组来存储矩阵。@FelixPalmen谢谢。这是在编译器中强制执行的吗?我不知道
C
编译器可能是这样的ct。@kabanus不,这使它更麻烦,就像许多C代码可能导致未定义的行为;)@FelixPalmen啊,这就是它如此可爱的原因。谢谢你的回复,但这不是我真正想要的。这是我认为你弄错的地方。参数col1和col2不是“第一列”,而且“第二列"。它们是我们要切换的矩阵的任意两列。因此,每当我们在原始矩阵中循环时,我们必须查看数字是否在正确的列中,然后将其与另一列中的数字切换。它是1D数组的原因是b/c这是一个类的赋值。我很确定应该检查数字是否r在我们试图交换的列中。例如,如果我们有一个4x3矩阵,我们想交换第2列和第3列,我们必须确保我们不会用任何东西交换第1列和第4列中的值;我认为这是在代码中发生的。(现在没有工具来检查,所以这与我看到的情况不符)是的,哈哈。对不起,我只是有点困惑,但它现在可以工作了。谢谢。如果我现在想交换行,我会用rowSize替换每个colSize,反之亦然吗?还是没那么简单…我遇到了行交换的问题(我编辑了主帖以显示函数和结果)谢谢你的回复,但这并不是我想要的。我想这是我弄错你的地方。参数col1和col2不是“第一列”和“第二列”。它们是我们想要切换的矩阵的任意两列。