• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 矩阵乘法的分治算法实现思路

矩阵乘法的分治算法实现思路

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了矩阵乘法算法,算法提高 矩阵乘法,算法训练 矩阵乘法,矩阵乘法算法复杂度,矩阵乘法公式等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:矩阵乘法的分治算法实现思路
描述:

为了提高编程能力和算法,一边看算法导论,一边实现。

到矩阵乘法分治求解的时候,思路很简单,我也理解了,可是怎么实现伪代码时出现了问题,搞了一天也没搞出来。

大致意思就是把矩阵切田字块,求解子矩阵,再合并。

导论提示用下标。我就试着按它来,自己写了个矩阵结构体二位数组,并且为了整洁地定位一个矩阵的二维下标,又写了个位置结构体。

可是递归函数的调用和传参就是弄不明白
我现在想到的递归函数参数有 a,b,c三个矩阵的引用(因为算完值要放进c中)和三个矩阵要操作的部分(子矩阵)位置,一开始觉得没什么问题,可是写到两个递归函数调用再相加赋值给C矩阵,我就懵了,我不能把c传进去,因为求和才是c那个元素的值,可是递归出口(子矩阵row为1时)又的确赋值给c了。。。

智商不够的我彻底懵了,思维乱掉了,想了一天,画了一天图也没搞出来,求前辈指点。

算法的实现太繁琐,不用麻烦,只要前辈,大神们给个思路就好,先谢谢了


解决方案1:

转载自这里,稍有改动。与原书中的伪代码思路是相同的。

// C++
#include <iostream>
#include <vector>

template<typename T>
struct Matrix {
  Matrix(size_t r, size_t c) {
    Data.resize(c, std::vector<T>(r, 0));
  }

  void SetSubMatrix(const int r, const int c, const int rn, const int cn,
                    const Matrix<T>& A, const Matrix<T>& B) {
    for (int cl = c; cl < cn; ++cl)
      for (int rl = r; rl < rn; ++rl)
        Data[cl][rl] = A.Data[cl - c][rl - r] + B.Data[cl - c][rl - r];
  }

  static Matrix<T> SquareMultiplyRecursive(Matrix<T>& A, Matrix<T>& B,
                                           int ar, int ac, int br, int bc, int n) {
    Matrix<T> C(n, n);

    if (n == 1) {
      C.Data[0][0] = A.Data[ac][ar] * B.Data[bc][br];
    } else {
      C.SetSubMatrix(0, 0, n / 2, n / 2,
        SquareMultiplyRecursive(A, B, ar, ac, br, bc, n / 2),
        SquareMultiplyRecursive(A, B, ar, ac + (n / 2), br + (n / 2), bc, n / 2));

      C.SetSubMatrix(0, n / 2, n / 2, n,
        SquareMultiplyRecursive(A, B, ar, ac, br, bc + (n / 2), n / 2),
        SquareMultiplyRecursive(A, B, ar, ac + (n / 2), br + (n / 2), bc + (n / 2), n / 2));

      C.SetSubMatrix(n / 2, 0, n, n / 2,
        SquareMultiplyRecursive(A, B, ar + (n / 2), ac, br, bc, n / 2),
        SquareMultiplyRecursive(A, B, ar + (n / 2), ac + (n / 2), br + (n / 2), bc, n / 2));

      C.SetSubMatrix(n / 2, n / 2, n, n,
        SquareMultiplyRecursive(A, B, ar + (n / 2), ac, br, bc + (n / 2), n / 2),
        SquareMultiplyRecursive(A, B, ar + (n / 2), ac + (n / 2), br + (n / 2), bc + (n / 2), n / 2));
    }

    return C;
  }

  void Print() {
    for (size_t c = 0; c < Data.size(); ++c) {
      for (size_t r = 0; r < Data[0].size(); ++r)
        std::cout << Data[c][r] << " ";
      std::cout << "\n";
    }
    std::cout << "\n";
  }

  std::vector<std::vector<T> > Data;
};

int main() {
  Matrix<int> A(2, 2);
  Matrix<int> B(2, 2);

  A.Data[0][0] = 2; A.Data[0][1] = 1;
  A.Data[1][0] = 1; A.Data[1][1] = 2;

  B.Data[0][0] = 2; B.Data[0][1] = 1;
  B.Data[1][0] = 1; B.Data[1][1] = 2;

  A.Print();
  B.Print();

  Matrix<int> C(Matrix<int>::SquareMultiplyRecursive(A, B, 0, 0, 0, 0, 2));

  C.Print();
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 矩阵乘法的分治算法实现思路

相关文章

  • 2017-06-07 在python脚本中判断sql文件中存储过程和函数
  • 2017-06-07 如何在Python中实现js的escape?
  • 2017-06-07 (VFP)如何在ODBC数据源中,通过外网连接另一台计算机上的SQL数据库?
  • 2017-06-07 ejb30+jboss50集群疑问与经验
  • 2017-06-07 python快速遍历文件夹下面三十几万txt文档
  • 2017-06-07 基于数据库的JAAS出错,不存在usersproperties
  • 2017-06-07 Python用一个数字比较List中的数字
  • 2017-06-07 关于Jbpm不能触发流程跳转的问题
  • 2017-06-07 python字典嵌套遍历与赋值
  • 2017-06-07 怎么将需要上传的照片加水印

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • Python:2段解码(decode)代码的本质区别
    • C++截取后N位字符串
    • x:变量是否能是数组
    • QQ邮箱收不到七牛激活邮件怎么办
    • 在pycharm中写python使用fromimpotas会有提示?请问这是违反了PE8的什么规定吗?
    • 如何正确取消七牛镜像功能
    • 用七牛后有个图片链接前面多加了个网站网址,导致不显示!!什么原因
    • 重命名Oraclerediskey重命名如何无缝升级
    • 如何匹配双引号里面的内容?{"颜色:":"酒红色","尺码:":"31"}
    • (redis)linux资源限制,软限制可以超出硬限制么?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有