对于给定的m X n 矩阵A 和 n X k 矩阵B, 其乘积矩阵为: C= AB,矩阵C为m X k阶
前提 矩阵A的列数必须等于矩阵B的行数,并且指出矩阵的乘法是不具备交换性(AB != BA)
n-1
乘积矩阵C中各元素值为: Cij = ∑ anbij i= 0,1,.....m -l; j = 0, 1, .... k -1
前提 矩阵A的列数必须等于矩阵B的行数,并且指出矩阵的乘法是不具备交换性(AB != BA)
n-1
乘积矩阵C中各元素值为: Cij = ∑ anbij i= 0,1,.....m -l; j = 0, 1, .... k -1
i=0
// MatrxMuls.cpp : Defines the entry point for the console application.
//
// 二维数组 变成一维数组 A[m][n] ---> B[m*n]
#include "stdafx.h"
#include <IOSTREAM>
#include <CSTDIO>
#include <CSTDLIB>
using namespace std;
#define UINT unsigned int
void MatrixMuls(double A[], double B[], UINT m, UINT n, UINT k, double C[])
{
int i, j, u, l;
for (i = 0; i < m; i++)
{
for (j = 0; j < k; j++)
{
u = i * k + j; // A i行 * B k列 + B j列
C[u] = 0.0;
for (l = 0; l < n; l++)
{
C[u] += A[i*n+l] + B[l*k+j]; // A[i*n+j] 位于 row = i*n col = j
}
}
}
}
int main(int argc, char* argv[])
{
double A[3][3] = {
{1.0, 2.0, 3.0},
{4.0, 5.0, 6.0},
{7.0, 8.0, 9.0}
};
double B[3][3] = {
{2.0, -2.0, 1.0},
{1.0, 3.0, 9.0},
{17.0, -3.0, 7.0}
};
int m = 3, n = 3, k=3, i, j;
double C1[3*3] = {0};
printf("矩阵A和B相加的结果为: \n");
// 二维不能传给一维 cannot convert parameter 1 from 'double [3][3]' to 'double []'
double A1[3*3] = {0};
for (i = 0; i < n*m; i++)
{
A1[i] = A[i/n][i%n];
}
// 二维转换一维
double C[3][3] = {0};
double B1[3*3] = {0};
for (i = 0; i < n*m; i++)
{
B1[i] = B[i/n][i%n];
}
MatrixMuls(A1, B1, m, k, n, C1);
// 一维转换二维
for (i = 0; i < n*m; i++)
{
C[i/n][i%n] = C1[i];
}
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%10.6f", C[i][j]);
}
printf("\n");
}
/*
for (i = 0; i < m*n; i++)
{
printf("%10.6f", C[i]);
}
*/
return 0;
}
矩阵A和B相加的结果为:
26.000000 4.000000 23.000000
35.000000 13.000000 32.000000
44.000000 22.000000 41.000000
Press any key to continue