[C]m*n矩阵划分成k*j等份

来源:互联网 发布:数据库性能测试 编辑:程序博客网 时间:2024/05/17 04:27

测试源码

#include "stdafx.h"#include <cstdlib>#include <cstdio>//定义结点用于存储最后的数据矩阵typedef struct sNode {    int sum;    int count;    sNode *pNext;    sNode():sum(0),count(0),pNext(NULL){}}sNode;//找到第m行n列所在的结点 resultN是最后结果集中的列数sNode* findNode(sNode*head, int m, int n,int resultN) {    sNode* p = head->pNext;    //先后移m-1行    for (int i = 0; i < m*resultN; i++) {        p = p->pNext;    }    for (int i = 0; i < n; i++) {        p = p->pNext;    }    return p;}//arr 矩阵数组 m为行数 n 为列数 splitM需拆分的行 splitN需拆分的列sNode* calculate(int * arr, int m, int n,int splitM,int splitN) {    //如果想拆分的行列比现有的行列还大 则是不可拆分的    if (splitM > m || splitN > n) {        return NULL;    }    sNode* head = new sNode;    //初始化最后存储的数据    int resultM = m / splitM;    int resultN = n / splitN;    for (int i = 0; i < splitM*splitN; i++)    {        sNode * t = new sNode;        t->pNext = head->pNext;        head->pNext = t;    }    for (int i = 0; i < m; i++) {        for (int j = 0; j < n; j++) {            //确定结果属于第几行第几列 获取对应的数据存储结点            int findM = i / resultM < splitM ? i / resultM : splitM-1;            int findN = j / resultN < splitN ? j / resultN : splitN-1;            sNode* curNode = findNode(head , findM , findN, splitN);            curNode->sum += *(arr + i*n + j);            curNode->count++;        }    }    return head;}//输出均值void PrintAvg(sNode*head,int splitN) {    sNode*p = head->pNext;    int i = 0;    while (p) {        printf("%d\t", p->sum/p->count);        p = p->pNext;        i++;        if (i % 2 == 0)            printf("\n");    }    printf("\n");}//输出链表内容void Print(sNode*head, int splitN) {    sNode*p = head->pNext;    int i = 0;    while (p) {        printf("[%d,%d]\t", p->sum, p->count);        p = p->pNext;        i++;        if (i % 2 == 0)            printf("\n");    }    printf("\n");}//输出原始数组void PrintArray(int *arr, int m, int n) {    for (int i = 0; i < m; i++) {        for (int j = 0; j < n; j++) {            printf("%d\t", *(arr + n*i + j));        }        printf("\n");    }    printf("\n");}//释放链表内存void Destroy(sNode* head) {    while (head) {        sNode* p = head;        head = head->pNext;        delete p;    }}int main(){    //需将其拆分成splitM * splitN    int splitM = 2;    int splitN = 2;    //下面的计算结果 对四行六列的进行 2*2划分    //[12,6]  [30,6]    //[12,6]  [30,6]    /*int m = 4;  //矩阵行数    int n = 6;   //矩阵列数    int arr[4][6] = {        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 }    };*/    //下面的计算结果 对五行六列的进行 2*2划分    //[12,6]  [30,6]      //[18,9]  [45,9]    /*int m = 5;  //矩阵行数    int n = 6;   //矩阵列数    int arr[5][6] = {        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 },        { 1,2,3,4,5,6 }    };*/    //下面的计算结果 对四行七列的进行 2*2划分    //[12,6]  [44,8]      //[12,6]  [44,8]    int m = 4;  //矩阵行数      int n = 7;   //矩阵列数    int arr[4][7] = {    { 1,2,3,4,5,6,7 },    { 1,2,3,4,5,6,7 },    { 1,2,3,4,5,6,7 },    { 1,2,3,4,5,6,7 }    };    printf("原始矩阵数组: \n");    PrintArray((int*)arr, m, n);    sNode* result = calculate((int *)arr, m, n, splitM, splitN);    if (!result) {        printf("无法拆分...\n");        return 0;    }    printf("结果二元组[sum,count]:\n");    Print(result, splitN);    //输出均值结果    printf("计算结果如下: \n");    PrintAvg(result, splitN);    Destroy(result);    system("pause");    return 0;}

测试结果

这里写图片描述

0 0
原创粉丝点击