n阶矩阵一般乘法-《算法导论》学习笔记五

A、B两个矩阵均是nxn的矩阵,则两个矩阵的乘法:
这里写图片描述
一般的矩阵乘法代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

class SquareMatrix {
public:
    SquareMatrix(){}
    SquareMatrix( int row, int col ):
        mRow(row), mCol(col)
    {
        Init();
    }
    ~SquareMatrix()
    {
        for ( int i = 0; i < mRow; i++ ) {
            delete[] mElement[i];
            //printf("delete %d\n", i);
        }
        delete[] mElement;
    }
    void Init()
    {
        mElement = new int*[mRow];
        for ( int i = 0; i < mCol; i++ ) {
            mElement[i] = new int[i];
        }
    }
    void SetElement( int lowV, int upV )
    {
        int size = upV - lowV;

        for ( int i = 0; i < mRow; i++ ) {
            for ( int j = 0; j < mCol; j++ ) {
                mElement[i][j] = rand() % size + lowV;
            }
        }
    }
    void PrintElement()
    {
        printf("=========================================\n");
        for ( int i = 0; i < mRow; i++ ) {
            for ( int j = 0; j < mCol; j++ ) {
                printf("%d ", mElement[i][j]);
            }
            printf("\n");
        }
        printf("=========================================\n");
    }
public:
    int mRow;
    int mCol;
    int *(*mElement);
};
void SquareMatrixMultiply( 
    SquareMatrix &a, 
    SquareMatrix &b, 
    SquareMatrix &c )
{
    int n = a.mRow;

    c.mRow = c.mCol = n;
    c.Init();

    for ( int i = 0; i < n; i++ ) {
        for ( int j = 0; j < n; j++ ) {
            c.mElement[i][j] = 0;
            for ( int k = 0; k < n; k++ ) {
                c.mElement[i][j] += a.mElement[i][k] * b.mElement[j][k];
            }
        }
    }
}
int main( int argc, char **argv ) 
{

    if ( argc != 2 ) {
        printf("Usage:./binaryfile num\n");
        exit( 0 );
    }

    int n = atoi( argv[1] );

    SquareMatrix smA( n, n ), smB( n, n ), smC;
    smA.SetElement( 1, 10 );
    smA.PrintElement();

    smB.SetElement( 1, 10 );
    smB.PrintElement();

    SquareMatrixMultiply( smA, smB, smC );
    smC.PrintElement();

    printf("init square matrix finished\n");
    return 0;
}

算法复杂度为O(n^3),而Stranssen算法通过分治法将大矩阵切分为小矩阵进行计算,算法复杂度可以降低为O(n^2.81),但是尝试写下代码,发现切割子矩阵时有点复杂,普通的切分会创建子矩阵并复制值,而用下标进行计算又比较复杂,下次有空再尝试写吧。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值