如何交换矩阵中的两行(在C中)?

如何交换矩阵中的两行(在C中)?,c,matrix,row,swap,C,Matrix,Row,Swap,例如,给定一个矩阵: 1 2 3 4 5 6 7 8 9 如果要交换第[0]行和第[1]行,则生成的矩阵为: 4 5 6 1 2 3 7 8 9 你们能帮我得到一个C语言的代码吗?答案完全取决于“矩阵”是如何实现的,因为C语言没有这样的概念 temprow = row[1]; row[1] = row[0]; row[0] = temprow; 您使用的是二维数组吗 double m[3][3]; 还是别的什么 二维阵列 您必须手动移动各个元素 for (i=0; i<ROWLENGT

例如,给定一个矩阵:

1 2 3

4 5 6

7 8 9

如果要交换第[0]行和第[1]行,则生成的矩阵为:

4 5 6

1 2 3

7 8 9


你们能帮我得到一个C语言的代码吗?

答案完全取决于“矩阵”是如何实现的,因为C语言没有这样的概念

temprow = row[1];
row[1] = row[0];
row[0] = temprow;
您使用的是二维数组吗

double m[3][3];
还是别的什么

二维阵列 您必须手动移动各个元素

for (i=0; i<ROWLENGTH; ++i){
  double temp;
  temp = m[r2][i];
  m[r2][i] = m[r1][i];
  m[r1][i] = temp;
}
这个结构的有趣之处在于,您仍然可以使用
[]]
符号访问它,但是行交换操作变得非常简单

double *temp;
temp = m[r2];
m[r2] = m[r1];
m[r1] = temp;
从您的角度来看,不规则数组有两个缺点(好吧,这是内存管理麻烦的三个原因):它们需要为行指针提供额外的存储空间,并且不能使用内联初始化

行作为结构 C不支持窗体的数组赋值

double r[3], q[3] = { 1, 2, 3 };
r = q; /* ERROR */
但它确实支持结构的按值赋值语义。这为您提供了一些人建议的实施方案,但没有解释:

typedef struct { double r[ROWLENGTH] } row;
row m[NUMROWS] = { {1, 2, 3}, {4, 5, 6}, {7, 8 9}};

row temp = m[2];
m[2] = m[1];
m[1] = temp;
这很滑。它需要一整行的内存,但是如果编译器有什么好的地方,它可能会很快。最大的缺点是不能再使用
[]]
语法处理单个矩阵元素。而是写
m[i].r[j]

其他
在c语言中实现“矩阵”还有很多其他的方法,但它们大多更复杂,而且只在特殊情况下才有用。当您需要这些元素时,您可以在每个元素的上下文中自己回答这些问题。

我可能会一次交换一个元素,以避免使用大量额外的存储空间。如果您主要使用的是图形变换,其中矩阵通常为3x3或4x4,那么James Curran的方法可能会更好一些。如果您正在(或可能正在)处理非常大的矩阵,这将节省内存,并且很可能运行得更快:

typedef int Row[3];
Row Matrix[3];

Row Temp;

memcpy(Temp, Matrix[0], sizeof(Row));
memcpy(Matrix[0], Matrix[1], sizeof(Row));
memcpy(Matrix[1], Temp, sizeof(Row));
int x[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};

for (int i=0; i<3; i++) {
    int temp = x[0][i];
    x[0][i] = x[1][i];
    x[1][i] = temp;
}
intx[3][3]={{1,2,3},{4,5,6},{7,8,9};

对于(inti=0;i解决这个问题,你的家庭作业

typedef struct {int m[3];} Row;
typedef int RowAccess[3];

main()
{
  Row tmp,row[]={{1,2,3},{4,5,6},{7,8,9}};
  RowAccess *rowa=row;
  tmp=row[0];
  row[0]=row[1];
  row[1]=tmp;
  /* easy access to matrix here: (is this what you want?) */
  rowa[0][0]=0;
  rowa[0][1]=1;
  ...
  return 0;
}

Hy!这是我关于堆栈溢出的第一篇文章,我知道它很长,希望我不会被禁止

可能最优雅的方法之一是使用一个函数交换两个接收到的参数-使用它交换矩阵组件。 正如许多人已经说过的,我们应该考虑使用辅助变量

auxiliary = a ;
a = b ;
b = auxiliary ; 
最近,我学习了一个新方法,我发现它令人印象深刻,它使用了按位异或操作(),因此不需要辅助操作

 a ^= b ;
 b ^= a ;
 a ^= b ;
您可以很容易地使用这个操作来交换两个元素(a和b)-我相信这是离题的,但我坚持这个想法,因为我发现它非常有趣。 最后,回答你的问题,你可以使用

int swap (int *a , int *b){
    (*a)^=(*b);
    (*b)^=(*a);
    (*a)^=(*b);
    return 0; 
}
当矩阵声明为

#define ROW_COUNT 5
#define COLUMN_COUNT 5
....
int a[ROW_COUNT][COLUMN_COUNT];
您可以使用异或方式交换行,首先确定需要交换的元素(根据行索引,正如您已经说过的)

printf(“\nSwap行:”);scanf(“%d”和&swp1);//第一行索引
printf(“带行:”;scanf(“%d”,&swp2);//第二行索引
对于(j=0;j
我希望这将对你的进一步实践有所帮助

再试试这个例子,我相信你会更好地理解整个想法(不要忘记矩阵索引从0开始!)

#包括“stdio.h”
#包括“conio.h”
#定义第5行
#定义列_计数5
整数交换(整数*a,整数*b){
(*a)^=(*b);
(*b)^=(*a);
(*a)^=(*b);
返回0;
}        
int main(){
int i,j;
int swp1,swp2;
int a[行计数][列计数];
//创建(行数X列数)随机矩阵
对于(i=0;i
有一个函数称为:

#包括
int A[][]={{1,2,3},{4,5,6},{7,8,9};
交换(A[0],A[2]);//交换第一行和最后一行

这是家庭作业吗?(请标记)这是家庭作业吗?你的矩阵是如何定义的?你知道如何交换两个int变量的值吗?你知道C中的循环吗?付出一些努力,应该得到奖励:)。这实际上是我的家庭作业。这是我唯一不知道怎么解的矩阵运算。矩阵为[100][100],但行和列由用户定义。实际上,我已经完成了交换行、添加行、矩阵加法、mult。等。请分享您当前的最大努力,以便其他人可以帮助您。如果没有代码,没有人知道您遇到的问题是什么。你知道如何在C中为
循环编写一个
?如何问聪明的问题:简短明了的版本:感谢链接mctylr。是啊,我知道如何写循环。事实上,我想做的是了解交换行的代码,然后进行修改,以适应mt代码。我使用的是2d数组。请帮助我:(使用正确的矩阵实现这可能是正确的,但是作为一个简单的回答(没有讨论矩阵实现和上面的变量类型),这是非常错误的。细节在c中很重要。如果你要交换行,这是
#define ROW_COUNT 5
#define COLUMN_COUNT 5
....
int a[ROW_COUNT][COLUMN_COUNT];
printf("\nSwap Row: "); scanf("%d", &swp1) ; // first row index
printf("With Row: "); scanf("%d", &swp2);    // second row index

for (j = 0 ; j < COLUMN_COUNT ; j++){
     swap(  &a[swp1][j] , &a[swp2][j] );   
}
#include "stdio.h"
#include "conio.h"

#define ROW_COUNT 5
#define COLUMN_COUNT 5



int swap (int *a , int *b){
        (*a)^=(*b);
        (*b)^=(*a);
        (*a)^=(*b);
        return 0; 

}        

int main(){
    int i, j ;
    int swp1, swp2 ; 
    int a[ROW_COUNT][COLUMN_COUNT];

    // Create ( ROW_COUNT X COLUMN_COUNT ) random matrix

    for (i = 0 ; i < ROW_COUNT ; i++ ) 
        for (j = 0 ; j < COLUMN_COUNT ; j++ )  a[i][j] = rand();

    // Display matrix before row swap

    for (i = 0 ; i < ROW_COUNT ; i++ ){ 
        for (j = 0 ; j < COLUMN_COUNT ; j++ )  printf("%d\t",a[i][j]);
        printf("\n");     
    }

    // Elements to be swapped

    printf("\nSwap Row: "); scanf("%d", &swp1) ;  // first row index
    printf("With Row: "); scanf("%d", &swp2);     // second row index

    // Swapping right here

    for (j = 0 ; j < COLUMN_COUNT ; j++){
         swap(  &a[swp1][j] , &a[swp2][j] );   
    }


    // Display once again   

    printf("\n");
    for (i = 0 ; i < ROW_COUNT ; i++ ){ 
        for (j = 0 ; j < COLUMN_COUNT ; j++ )  printf("%d\t",a[i][j]);
        printf("\n");     
    }   



    getch();            
 return 0;   
} 
#include <algorithm>
int A[][] = {{1,2,3},{4,5,6},{7,8,9}};
swap(A[0],A[2]); //swaps first and last row