矩阵转置的一般算法

首先定义矩阵中存放元素的结构体

struct Triple
{
    int i, j;
    datatype e;
};

然后定义矩阵M, M中包含行数,列数,矩阵中元素个数,以及存放矩阵中每一个元素特征的一个数组

struct TripleTable
{
    Triple data[MAX_SIZE];
    int mu, nu, tu; //行数,列数,非零元素的个数
};

矩阵M转置为T的一般算法思路如下:

  首先建立矩阵,然后遍历矩阵M中的所有元素

  第一次扫描:

    将M中所有列号为1的元素赋值到T.data中

  第二次扫描:

    将M中所有列号为2的元素赋值到T.data中

  以此类推,知道M中的所有元素都放到T中去

具体代码如下:

#define MAX_SIZE 10000
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*
矩阵的转置算法
    基本思想:
        对M.data从头至尾进行扫描
        第一次扫描:
            将M.data中所有列号为1的元素赋值到T.data中
        第二次扫描:
            将M.data红所有列号为2的元素赋值到T.data中
        以此类推,直至将M.data中的所有元素赋值到T.data中
*/
typedef int datatype;
struct Triple
{
    int i, j;
    datatype e;
};
struct TripleTable
{
    Triple data[MAX_SIZE];
    int mu, nu, tu; //行数,列数,非零元素的个数
};
void TransposeSMatrix(struct TripleTable &M, struct TripleTable &T)
{
    int q = 0;
    T.mu = M.nu;
    T.nu = M.mu;
    T.tu = M.tu;
    if(T.tu)
    {
        for(int col = 1; col <= M.nu; ++col)
        {
            for(int p = 1; p <= M.tu; ++p)
            {
                if(M.data[p].j == col)
                {
                    T.data[q].i = M.data[p].j;
                    T.data[q].j = M.data[p].i;
                    T.data[q].e = M.data[p].e;
                    ++q;
                }
            }
        }
    }
}
void Init(struct TripleTable &M)
{
    M.mu = 7; M.nu = 6; M.tu = 8;
    M.data[1].i = 1; M.data[1].j = 2; M.data[1].e = 12;
    M.data[2].i = 1; M.data[2].j = 3; M.data[2].e = 9;
    M.data[3].i = 3; M.data[3].j = 1; M.data[3].e = -3;
    M.data[4].i = 3; M.data[4].j = 6; M.data[4].e = 14;
    M.data[5].i = 4; M.data[5].j = 3; M.data[5].e = 24;
    M.data[6].i = 5; M.data[6].j = 2; M.data[6].e = 18;
    M.data[7].i = 6; M.data[7].j = 1; M.data[7].e = 15;
    M.data[8].i = 6; M.data[8].j = 4; M.data[8].e = -7;
}
void Print(struct TripleTable M)
{
    for(int a = 1; a <= M.mu; a++)
    {
        for(int b = 1; b <= M.nu; b++)
        {
            int flag = 1;
            for(int k = 1; k <= M.tu; k++)
            {
                if(M.data[k].i == a && M.data[k].j == b)
                {
                    printf("%8d", M.    data[k].e);
                    flag = 0;
                    break;
                }
            }
            if(flag)
                printf("       0");
        }
        printf("\n");
    }
    printf("\n");
}
int main()
{
    struct TripleTable M, T;
    Init(M);
    for(int i = 1; i <= M.tu; i++)
    {
        printf("%d %d %d \n", M.data[i].i, M.data[i].j, M.data[i].e);
    }
    Print(M);
    system("pause");
    TransposeSMatrix(M, T);
    Print(T);
    return 0;
}

 

posted on 2015-11-23 21:37  张明明_1  阅读(2268)  评论(0编辑  收藏  举报

导航