c语言矩阵运算

如题所述

矩阵乘法程序,动态分配内存:

#include<stdio.h>

// b[j][k] * c[k][i] = a[j][i]
void matrix(int **b,int **c, int **a, int nx, int ny, int nk)
{
int i,j,k;
for (j=0;j<ny;j++)for(i=0;i<nx;i++)a[j][i]= 0;
for(j=0;j<ny;j++){
for(i=0;i<nx;i++){
for(k=0;k<nk;k++)a[j][i]+= b[j][k]*c[k][i];
};
};
}

void main()
{
int i,j,k,tmp;
int b_row,b_col;
int c_row,c_col;
int a_row,a_col;
int **b,**c,**a;

// 输入B 阵 行数 列数
printf("please enter b_row b_col of matrix B\n");
scanf("%d %d",&b_row,&b_col);
c_row = b_col;

// 输入C阵 列数
printf("please enter c_col of matrix C\n");
scanf("%d",&c_col);
a_row = b_row;
a_col = c_col;

a = (int **) malloc(sizeof(int *) * a_row);
for (j=0;j<a_row;j++){
a[j] = (int *) malloc(sizeof(int) * a_col);
}

b = (int **) malloc(sizeof(int *) * b_row);
for (j=0;j<b_row;j++){
b[j] = (int *) malloc(sizeof(int) * b_col);
}

c = (int **) malloc(sizeof(int *) * c_row);
for (j=0;j<c_row;j++){
c[j] = (int *) malloc(sizeof(int) * c_col);
}

if (!c[c_row-1]) {
printf("no enought memory\n");exit(0);
}
// 输入B阵元素
printf("Please input int matrix b[%d][%d]\n",b_row,b_col);
for (j=0;j<b_row;j++)
for (i=0;i<b_col;i++){
scanf("%d",&tmp);
b[j][i] = tmp;
}
// 输入C阵元素
printf("Please input int matrix c[%d][%d]\n",c_row,c_col);
for (j=0;j<c_row;j++)
for (i=0;i<c_col;i++){
scanf("%d",&tmp);
c[j][i] = tmp;
}

matrix( b ,c,a, a_col, a_row, b_col);

for(j=0;j<a_row;j++)
{
for (i=0;i<a_col;i++) printf("%d ",a[j][i]);
printf("\n");
};
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-12
我在这儿给你提供一些思路:码程序交给你自己了!
0、提示输入4*4的实数矩阵,然后键盘依次输入实数矩阵中各元素;在屏幕上先用printf输出了4*4 矩阵的形式;
1、4*4的实数矩阵,那以为这定义一个float a[4][4]的4*4的二维矩阵或者float a[16]的一维矩阵;
2、求所有的元素中负数的个数,意思是把你把数组中每个数和0比较一遍,即循环16次,发现小于 0则把一个全局变量加1,就求出了所有的负数的个数!
3、二维数组循环通常用两个for循环完成,再找一个全局变量用于求元素之和的。一维数组的话更 简单
4、输出(2)、(3)就把那2个全局变量的值输出即可!
希望可以帮到你,如果满意请采纳!
其实你屏幕上显示的是4*4矩阵的形式是输入的,但是存储可以使用长度为16的一维数组,这样更加容易了!
第2个回答  2014-04-29
#include<stdio.h>
int main()
{
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int b[4][5]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int i,j,z,x,y,c[3][5];
for(i=0;i<3;i++)
{
for(j=0;j<4;j++)
{   
c[i][j]=0; //j不能等于4,所以你的二维数组c中c[][4]没有初始化,所以才会出现乱码
for(z=0;z<5;z++)
c[i][j]+=a[i][j]*b[j][z];
}
}
 
    for(x=0;x<3;x++)
{   
for(y=0;y<5;y++)
printf("%d\t",c[x][y]);
printf("\n");
}
return 0;
}

第3个回答  2017-10-15
#include<vector>
#include<iostream>
int main()
{
    using namespace std;
    int m,n,p;
    vector<vector<int>>A,B,C;
    cout<<"please input m,n,p"<<endl;
    cin >>m>>n>>p;
    vector<int>tmp;
    int ttp;
    for(int i = 0; i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>ttp;
            tmp.push_back(ttp);
        }
        A.push_back(tmp);
        tmp.clear();
    }
    for(int i = 0; i<n;i++)
    {
        for(int j=0;j<p;j++)
        {
            cin>>ttp;
            tmp.push_back(ttp);
        }
        B.push_back(tmp);
        tmp.clear();
    }
    for(int i = 0; i<m;i++)
    {
        for(int j=0;j<p;j++)
        {
            ttp = 0;
            for(int k = 0; k <n;k++)
                ttp = ttp + A[i][k]*B[k][j];
            tmp.push_back(ttp);
        }
        C.push_back(tmp);
        tmp.clear();
    }
     for(int i = 0; i<m;i++)
    {
        for(int j=0;j<p;j++)
        {
             cout<<C[i][j]<<' ';   
        }
        cout<<endl;
    }
    system("pause");
}

现在是2017年10月15日,无意中回答了一道2011年12月09日的题,留念。

第4个回答  2011-12-09
哥们,代码如下,试一下吧

#include <stdio.h>
#include <math.h>
int main ()
{
int a[2][3]={1,0,3,3,4,0},b[3][4]={1,0,2,1,2,3,4,5,2,1,1,5},c[2][4],i,j;
printf("2 3 4\n");
for (i=0;i<2;i++)
{
for (j=0;j<3;j++)
printf("%d ",a[i][j]);
printf("\n");
}
for (i=0;i<3;i++)
{
for (j=0;j<4;j++)
printf("%d ",b[i][j]);
printf("\n");
}
for (i=0;i<2;i++)
{
for (j=0;j<4;j++)
{
c[i][j] = 0;
for (int x=0;x<3;x++)
c[i][j]+=a[i][x]*b[x][j];
}
}
for (i=0;i<2;i++)
{
for (j=0;j<4;j++)
printf("%d ",c[i][j]);
printf("\n");
}

}