69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]
*【函数输出】:数组arr_C的地址
*/
int **Matrix_Common (int **arr_A, int **arr_B, int len_i, int len_j, int len_k)
{
int **arr_C = NULL;
for(int i = 0; i<len_i; i++)
for(int k = 0; k<len_k; k++)
for(int j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
printf ("4***********\n");
return arr_C ;
}
int main()
{
// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};
//
int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int **arr_C = Matrix_Common ((int **)arr_A, (int **)arr_B, 2, 3, 4);
for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]、arr_C[len_i][len_k]
*【函数输出】:无
*/
void Matrix_Common (int **arr_A, int **arr_B, int **arr_C, int len_i, int len_j, int len_k)
{
int i = 0;
int j = 0;
int k = 0;
for(i = 0; i<len_i; i++)
for(k = 0; k<len_k; k++)
for(j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
}
int main()
{
// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};
int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int arr_C[2][4];
Matrix_Common ((int **)arr_A, (int **)arr_B, (int **)arr_C, 2, 3, 4);
for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
/*
*【功能说明】:普通的矩阵乘法
*【函数参数】:数组arr_A[len_i][len_j]、 arr_B[len_j][len_k]
*【函数输出】:数组arr_C的地址
*/
int **Matrix_Common (int **arr_A, int **arr_B, int len_i, int len_j, int len_k, int* arr_C[])
{
//int **arr_C = NULL;
for(int i = 0; i<len_i; i++)
for(int k = 0; k<len_k; k++)
for(int j = 0; j<len_j; j++)
arr_C[i][k] += arr_A[i][j] * arr_B[j][k];
printf ("4***********\n");
return arr_C ;
}
int main()
{
// int arr_A[4][4] = {{1,0,2,1}, {4,1,1,0}, {0,1,3,0}, {5,0,2,1}};
// int arr_B[4][4] = {{0,1,0,1}, {2,1,0,4}, {2,0,1,1}, {1,3,5,0}};
//
int arr_A[2][3] = {{1,2,3}, {4,5,6}};
int arr_B[3][4] = {{1,2,3,4}, {5,6,7,8}, {9,10,11,12}};
int arr_C[2][4];
int **arr_C = Matrix_Common ((int **)arr_A, (int **)arr_B, 2, 3, 4, arr_C);
for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
arr_C[i][k] += arr_A[i][j] * arr_B[j][k]; //acc_C = NULL,acc_C[i][j]越界了,需要分配空间。
//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19
int a[2][3] = {{1,2,3},{4,5,6}};
int **p = (int**)(a);
a[1][2]; //5
p[1]; //类型为int*,值2,假设sizeof(int) == sizeof(int*)
p[1][2]; //等价于*((int*)2), 当然访问了无效的地址
//可见 a[1][2]和p[1][2]不等价
#include <cstdio>
template<typename T, size_t I, size_t J, size_t K>
void Matrix_Production (T (*arr_A)[I][J], T (*arr_B)[J][K], T (*arr_C)[I][K])
{
size_t i = 0, j = 0, k = 0;
for(i = 0; i< I; i++)
for(k = 0; k<K; k++)
for(j = 0; j< J; j++)
(*arr_C)[i][k] += (*arr_A)[i][j] * (*arr_B)[j][k];
}
int main()
{
int arr_A[2][3] = {
{1,2,3},
{4,5,6}
};
int arr_B[3][4] = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12}
};
int arr_C[2][4]= {{0}};
Matrix_Production (&arr_A, &arr_B, &arr_C);
for(int i = 0; i<2; i++)
{
for(int j = 0; j<4; j++)
printf("%5d", arr_C[i][j]);
printf("\n");
}
return 0;
}
void Matrix_Common (int **arr_A, int **arr_B, int **arr_C, int len_i, int len_j, int len_k)
{
/**A = I x J, B = J x K , C = I*K **/
int ia, ic;
int ja, jb;
int kb, kc;
for(ic = 0; ic < len_i; ++ic)
{
for( kc= 0; kc < len_k; ++kc)
{
arr_C[ic][kc] = 0;
for(ia = ic, kb = kc, ja = 0, jb = 0; ja < len_j; ++ja,++jb)
{
arr_C[ic][kc] += arr_A[ia][ja] * arr_B[jb][kb];
}
}
}
}