矩阵乘法分治法c语言,分治法举例之矩阵乘法

分治法举例之矩阵乘法

前言

矩阵按定义直接实现是比较直接简单的。时间复杂度也可以直接得出来是(O(n^3))

直接实现

class matrix:

'''

为了简单起见,没有对数据做校验。

假设矩阵就是nxn的。

'''

def __init__(self, data):

if not data or not hasattr(data, '__getitem__'):

raise ValueError("data not valid! %s" % data)

self.data = data

self.rows = len(data)

self.cols = max(map(lambda row: len(row), data))

def __mul__(self, another):

if self.cols != another.rows:

raise ValueError("not valid ddata ,only support mxn * nxp")

ret = matrix([[0 for _ in range(another.cols)] for _ in range(self.rows)])

for i in range(self.rows):

for j in range(another.cols):

num = 0

for k in range(self.cols):

num += self._getitem(i, k) * another._getitem(k, j)

ret._setitem(i, j, num)

return ret

def _getitem(self, i, j):

if i >= self.rows or j >= self.cols:

raise IndexError("index out of boundary,i=%d,j=%d, %s" % (

i, j, self.data))

try:

return self.data[i][j]

except Exception:

return 0

def _setitem(self, i, j, value):

if i >= self.rows or j >= self.cols:

raise IndexError("index out of boundary,i=%d,j=%d,value=%s, %s" % (

i, j, str(value), self.data))

if j >= len(self.data[i]):

fill = self.cols - len(self.data[i])

self.data[i].extend([0 for _ in range(fill)])

self.data[i][j] = value

def __str__(self):

return "(rows:%d, cols:%d)->%s" % (self.rows, self.cols, self.data)

直接应用分治法

很简单的想法是把矩阵分成n/2的4块。于是

A*B = C

变成

[

\begin{pmatrix}

a & b

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值