c语言如何求一个16*16c语言矩阵的转置秩序

c语言上机题库 (1)_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
24页2下载券3页7下载券9页2下载券33页免费4页免费127页免费54页2下载券33页1下载券35页1下载券
喜欢此文档的还喜欢10页1下载券50页1下载券8页1下载券10页1下载券50页1下载券
c语言上机题库 (1)|
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢&&问题点数:0&&回复次数:9&&&
[求助]怎样求一个矩阵的逆
以3*3矩阵为例,虽然知道线性代数的公式,但还是不知道怎么用C来实现
[此贴子已经被作者于 23:08:48编辑过]
搜索更多相关主题的帖子:
等 级:新手上路
难道没有人会这个题吗?
等 级:新手上路
帖 子:789
是先算行列式的值吧,不过行列式很难算,用c实现可能还有很大近似误差.
等 级:新手上路
如果要算行列式的话,好要算转制矩阵的......
等 级:贵宾
威 望:15
帖 子:1314
我只学过2维的矩阵,没学过3维的
人生重要的不是所站的位置,而是所朝的方向
等 级:贵宾
威 望:22
帖 子:921
专家分:209
矩阵考完就忘了
偶是菜鸟鸟偶惧WHO?!!!!
等 级:贵宾
威 望:15
帖 子:1314
用这个公式吧: A的逆 = adj A / det A;
人生重要的不是所站的位置,而是所朝的方向
等 级:新手上路
这样还是不会写,有谁能写出代码来看一下
等 级:新手上路
帖 子:789
我今天去图书馆时特意看了一下,有一本经典好书,电子工业出版社的&&c数值算法&&,国外牛人写的有700多页里面讲到LU分解算法是比较好的算法之一.还有一本c++版本&&c++数值算法&&,内容差不多.你如果目的是解决实际问题,用专业的数学软件MATLAB,一个命令就算出来了.如果你目的就是想掌握算法,去找数值计算的书看,为了减小舍入误差,算法比较复杂,不是论坛里就能说清楚的.
等 级:新手上路
我来说吧,上学期学了线代,我粗心老算错作业题,就来了兴致写了个
思路是这样:先写个算行列式的函数 Det() ,算法是递归的那个,就是|A|= a[11]×|A[11]|+a[12]×|A[12]|+...+a[1n]×|A[1n]|
用第一行各项乘以各自代数余子式求和的那个公式,可以用递归写 Det(A)= a[11]×Det(A[11])+a[12]×Det(A[12])+...+a[1n]×Det(A[1n]),一直到2×2矩阵a[11]a[22]-a[12]a[21]然后就好办了吧,把A的伴随阵A*算出来,那么逆矩阵A^(-1) = A* / |A|部分代码class CMat{public:
friend float Det(CMat a);
//计算行列式
friend void put_to_E(CMat& a);
//转化为方阵(E)
friend unsigned _R_(CMat a);
//秩的计算
friend CMat& _oppo_(CMat& a); //
friend CMat& _cpn_(CMat& a);
friend CMat& _Trn_(CMat& a);
friend CMat& operator+(CMat& a, CMat& b);
friend CMat& operator-(CMat& a, CMat& b);
friend CMat& operator*(CMat& a, CMat& b);
friend CMat& operator^(CMat& a, int b);
//--------乘方
friend CMat& operator*(float a, CMat& b);
//--------数乘(左)
friend CMat& operator*(CMat& b, float a);
//--------数乘(右)
friend CMat& operator-(CMat& a);
//--------取负
//-------------------------------------------//private:
unsigned m,n;
float*};//...float Det(CMat a)
//*.-求行列式{
unsigned _m = a.m, _n = a.n;
float* _p = a.p;
if(a.m != a.n)
printf("不能求行列式,此矩阵不是方阵");
if(a.m == 2)
float __1 = (*_p), __2 = (*(_p + 3)), __3 = (*(_p + 1)), __4 = (*(_p + 2));
return (*_p) * (*(_p + 3)) - (*(_p + 1)) * (*(_p + 2));
float tempResult = 0;
for(unsigned j = 0; j & _n; j++)
float* pCm_temp = new float[(_m - 1) * (_n - 1)];
for(unsigned i = 0, iTemp = 0; i & _m; i++)/*-------------确定余子式*/
for(unsigned q = 0; q & _n; q++)
if((i != 0)&&(q != j))
*(pCm_temp + iTemp) = *(_p + i * _m + q);
/*------------------------------------------------确定余子式*/
cm_temp.p = pCm_
cm_temp.m = _m -1; cm_temp.n = _n - 1;
_TEST(cm_temp.CMatrix_print();)
if(j % 2 == 0)
tempResult += Det(cm_temp) * (*(_p + j));
tempResult -= Det(cm_temp) * (*(_p + j));
_TEST(printf("tempResult = %g\n", tempResult);)
return tempR}CMat& _cpn_(CMat& a)
// ---伴随阵{
if(a.n != a.m)
printf("阵型不匹配,不是方阵!\n");
unsigned _m = a.m;
unsigned _k = _m, _l = _m;
/*纪录行号*/
unsigned num1 = _m * _m;
unsigned num2 = (_m - 1) * (_m - 1);
CMat* p_result = new CM
float* p_f = new float[num1];
float* p_f_temp = new float[num2];
float* pf_temp = p_f_
for(unsigned i = 0; i & _m; i++)
for(unsigned j = 0; j & _m; j++)
CMat* p_temp = new CM
p_temp-&p = p_f_
p_temp-&m = p_temp-&n = (_m - 1);
pf_temp = p_f_
for(unsigned k = 0; k & num1; k++)
_l = get_line(k, _m);
_k = (k % _m);
if(((i == _l)||(j == _k)))
*pf_temp = *(a.p + _l * _m + _k);
pf_temp++;
if((i + j)%2 == 0)
*(p_f + j * _m + i) = Det(*p_temp);
*(p_f + j * _m + i) = -Det(*p_temp);
p_result-&p = p_f;
p_result-&m = p_result-&n = _m;
return *p_}CMat& _oppo_(CMat& a)
---a^(-1){
CMat* p_result = new CM
*p_result = _cpn_(a) *(1 / Det(a));
return *p_}//...别的一些简单的实现就不写了,太长了~~我知道这个程序写的有很多的不足,也写的相当的乱,难以解读。。。我自己看着都费力。。。但她确实可以运行的很好~~如果你能耐着性子看完的一定是高手,请多指教吧~~
版权所有,并保留所有权利。
Powered by , Processed in 0.031107 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved2539人阅读
矩阵:数学上,一个m×n矩阵乃一m行n列的矩形阵列。矩阵由数组成,或更一般的,由某环中元素组成。
0.矩阵N*N相乘
#include&stdio.h&
int main(void)
int i,j,k;
double a[3][3],b[3][3],c[3][3];
for(i=0;i&3;i++){
for(j=0;j&3;j++){
printf(&Enter the number in a[%d][%d]\n&,i,j);
scanf(&%lf&,&a[i][j]);
for(i=0;i&3;i++){
for(j=0;j&3;j++){
printf(&Enter the number in b[%d][%d]\n&,i,j);
scanf(&%lf&,&b[i][j]);
for(i=0;i&3;i++){
for(j=0;j&3;j++){
c[i][j]=0;
for(k=0;k&3;k++){
c[i][j]=a[i][k]*b[k][j]+c[i][j];
for(i=0;i&3;i++){
for(j=0;j&3;j++){
%lf&,c[i][j]);
printf(&\n&);
1,求矩阵转置问题
根据主函数,编写一下两个函数
1:求数组a[4][4]主对角线上元素的和 ----区分主对角线和次对角线的区别
2:实现对数组a[4][4]的矩阵转置处理
#include&stdio.h&
void convert(int *p)
//数组转置
int i,j,t;
for(i=0;i&4;i++)
for(j=0;j&4;j++)
t=*(p+4*i+j);
*(p+4*i+j)=*(p+4*j+i);
*(p+4*j+i)=t;
int total(int a[][4],int n)
//主对角线上元素的和
int i,sum=0;
for(i=0;i&4;++i)
if(a[i][i]!=0)
sum+=a[i][i];
int total1(int a[][4],int n)
//次对角线上元素之和
int i,j,sum=0;
for(i=0;i&4;i++)
for(j=0;j&4;j++)
if((i+j)==3) sum+=a[i][j];
//此时仅当i+j=n-1的时候才是次对角线上的点
void main()
static int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int *p,i,sum,sum1;
sum=total(a,4);
sum1=total1(a,4);
printf(&主对角线之和:%d\n&,sum);
printf(&次对角线之和:%d\n&,sum1);
convert(p);
printf(&转置后的数组是:\n&);
for(i=0;i&4;++i)
printf(&%d %d %d %d \n&,a[i][0],a[i][1],a[i][2],a[i][3]);
2,求矩阵中最大值的问题
有一个3*4的矩阵,要求编程序求出其中值最大的那个元素的值,以及所在的行号和列号
#include&stdio.h&
void main()
int a[3][4],i,j;
int colum,
printf(&please input the array:\n&);
for(i=0;i&3;i++)
for(j=0;j&4;j++)
scanf(&%d&,a[i][j]);
printf(&\n&);
int max=a[0][0];
//设定最大值是第一个数
for(i=0;i&3;i++)
for(j=0;j&4;j++)
if(a[i][j]&max)
max=a[i][j];
printf(&max=%d,colum=%d,row=%d&,max,colum,row);
3,找出m*n矩阵的鞍点
#include&stdio.h&
#include&stdlib.h&
#define M 3
#define N 4
void main()
int a[M][N],i,j,k;
int max,t;
for(i=0;i&M;i++)
for(j=0;j&N;j++)
scanf(&%d&,&a[i][j]);
for(i=0;i&M;i++)
//此时假设每一行的最大值是第一个数即a[i][0]
for(j=i+1;j&N;j++)
//找出列中的最大值
if(a[i][j]&a[i][max])
for(t=1,k=0;k&M&&t;k++)
//判断是否在列中是不是最小值
if(a[k][max]&a[i][max])
//如果还存在数比a[k][max]的值还小,则置t=0,
//t是一个标识,t=0
表示不存在,
if(t) printf(&yes,%d\n&,a[i][max]);
printf(&no&);
}4,矩阵的周边之和问题
编写函数实现计算任意N*4整型矩阵上的周边元素之和
假设输入的数值
13 14 15 16
#include&stdio.h&
#define N 3
int fun(int a[][4],int n)
int i,sum=0;
for(i=0;i&4;i++)
sum+=a[0][i]+a[n-1][i];
//第一行和最后一行的和,此时的i代表的是列数
for(i=1;i&n-1;i++)
sum+=a[i][0]+a[i][3];
//第一列的的第二行开始到 n-1行的
和最后一列的的第二行开始到 n-1行的,此时的i代表的是行数
void main()
int a[N][4];
for(i=0;i&N;i++)
for(j=0;j&4;j++)
scanf(&%d&,&a[i][j]);
int s=fun(a,N);
printf(&矩阵N*4周边的元素之和为:%d&,s);
printf(&\n&);
5.判断一个N*N的矩阵是否为对称矩阵,将原矩阵输出,判断结果输出
#include&stdio.h&
#define N 10
void main()
int a[N][N],i,j,k,n;
scanf(&%d&,&n);
for(i=0;i&n;i++)
for(j=0;j&n;j++)
scanf(&%d&,&a[i][j]);
for(i=0;i&n;i++)
for(j=i+1;j&n;j++)
if(a[i][j]==a[j][i])
printf(&bushi&);
printf(&shi\n&);
for(i=0;i&n;i++)
for(j=0;j&n;j++)
printf(&%d&,a[i][j]);
6,求一个4*3的矩阵各行元素的最大值,将原矩阵和求出的最大值全部输出
#include&stdio.h&
void main()
int a[4][3],s[4],i,j,k;
for(i=0;i&4;i++)
for(j=0;j&3;j++)
scanf(&%d&,*(a+i)+j);
for(i=0;i&4;i++)
*(s+i)= *(*(a+i));
for(j=1;j&3;j++)
if(*(s+i) & *(*(a+i)+j))
*(s+i)= *(*(a+i)+j);
for(i=0;i&4;i++)
printf(&Row=%d Max=%d&,i,s[i] );
printf(&\n&);
7,求一个3*5的矩阵各列元素的最大值,将原矩阵和求出的最大值全部输出
#include&stdio.h&
void main()
int a[3][5],s[3],i,j,k;
for(i=0;i&3;i++)
for(j=0;j&5;j++)
scanf(&%d&,*(a+i)+j);
for(i=0;i&3;i++)
{ *(s+i)= *(*(a+j));
for(j=1;j&5;j++)
if(*(s+i) & *(*(a+i)+j))
*(s+i)= *(*(a+i)+j);
for(i=0;i&3;i++)
printf(&Line=%d Max=%d&,j,s[j] );
printf(&\n&);
8,求一个3*4的矩阵各列元素的平均值;将原矩阵和求出的平均值全部输出
#include&stdio.h&
void main()
int a[4][3],s[4],i,j,k;
for(i=0;i&4;i++)
for(j=0;j&3;j++)
scanf(&%d&,*(a+i)+j);
for(i=0;i&4;i++)
for(j=0;j&3;j++)
k+=a[i][j];
printf(&第%d行的平均值是%d&,i+1,k);
printf(&\n&);
9,求一个4*3的矩阵各行元素的平均值;将原矩阵和求出的平均值全部输出
#include&stdio.h&
void main()
int a[4][3],s[4],i,j,k;
for(i=0;i&4;i++)
for(j=0;j&3;j++)
scanf(&%d&,*(a+i)+j);
for(i=0;i&4;i++)
for(j=0;j&3;j++)
k+=a[i][j];
printf(&第%d行的平均值是%d&,i+1,k);
printf(&\n&);
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:52171次
排名:千里之外
原创:14篇在线等,求一个用C语言写的CRC-16位校验的WIN32控制台程序,非查表法_百度知道
在线等,求一个用C语言写的CRC-16位校验的WIN32控制台程序,非查表法
要求能输入8位数字 算CRC-16校验码 显示其高8位低8位先谢午作业 求效率啊 要死定
提问者采纳
#include &stdio.h&typedef utypedeftypedef union _CRC{
ushort crc16;
uchar by[2];} CRC;//输入带CRC码数据返值CRC码//输入带CRC码数据则进行校验返0CRC校验功否则CRC校验失败ushort CRC16(uchar *ba, int size){
crc.crc16 = 0
for (i=0; i& i++)
uchar ch = ba[i];
crc.by[0] = crc.by[0] ^
for (l=0; l&8; l++)
if (crc.by[0] & 0x01)
crc.crc16 = crc.crc16 && 1;
crc.crc16 = crc.crc16 ^ 0xa001;
crc.crc16 = crc.crc16 && 1;
uchar swap = crc.by[0];
crc.by[0] = crc.by[1];
crc.by[1] =
return crc.crc16;}void main(){
uchar ba[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
//计算CRC码
crc.crc16 = CRC16(ba, 8);
printf(&高字节:0x%x, 低字节:0x%x\n&, crc.by[1], crc.by[0]);
uchar bb[10] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0xb0, 0xcf};
if (0 == CRC16(bb, 10))
printf(&bb 校验功&);
printf(&bb 校验失败&);
提问者评价
你真棒,学习了
其他类似问题
控制台程序的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁C语言 第6章 2、二维数组_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
文档贡献者贡献于
评价文档:
15页免费31页免费6页免费16页1下载券3页免费33页免费29页免费28页免费2页免费1页免费
喜欢此文档的还喜欢48页免费15页免费39页免费68页免费72页免费
C语言 第6章 2、二维数组|C​语​言​ ​第章​ 、​二​维​数​组
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
大小:936.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢}

我要回帖

更多关于 c语言 矩阵乘法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信