如何交换矩阵中的两行(在C中)?
例如,给定一个矩阵: 1 2 3 4 5 6 7 8 9 如果要交换第[0]行和第[1]行,则生成的矩阵为: 4 5 6 1 2 3 7 8 9如何交换矩阵中的两行(在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
你们能帮我得到一个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