python实现长链矩阵的高效乘法

对于矩阵乘法,是在各类工程实践中都会有着广泛应用的方法,但是矩阵乘法存在耗时耗力的缺点,两个相乘的矩阵C=A.B,如果A对应的列数是n,B所对应的行数是n,那么矩阵C中的一个元素的运算过程就是:

添加图片注释,不超过 140 字(可选)

矩阵C中i行j列所对应的元素等于矩阵A中的第i行的元素与矩阵B中的第j列的元素分别相乘后再相加的值,这也就可以得出矩阵C的单个元素的计算时间就为O(n),而C中会存在n^2个元素,这也就会导致算出矩阵C的时间复杂度是3次方级别,因此得出的结论就是矩阵乘法的运算时长非常长。

添加图片注释,不超过 140 字(可选)

从上图又可以得出如果在多个矩阵相乘的时候,如果相乘的过程中使用结合律,调整矩阵相乘的次序的话,那将会有可能大大提高多个矩阵相乘的效率。

所以这里就可以考虑使用动态规划来实现多个矩阵相乘的过程,以达到提高效率的目的。而上表中的第四种矩阵相乘的次序是效率最高的,要如何通过动态规划来得到这个次序,也就是矩阵不同的乘法次序可以通过二叉树来展现假设当前有4个矩阵相乘,可以用括号来制定不同的矩阵相乘的次序,可以用二叉树来表达者两种对应乘法次序,例如:

添加图片注释,不超过 140 字(可选)

上图所示的矩阵相乘时候对应于二叉树的叶子结点,两个叶子节点的父节点对应于两个矩阵乘积后的矩阵,二叉树的根节点就是多个矩阵相乘后的最终结果。

使用python实现查找最优矩阵乘积次序的代码实现如下:

复制代码
import sys
N = 4 #相乘的矩阵数
M = []
M.append((50, 20))  #构造5.2.1节对应的4个矩阵维度
M.append((20, 1))
M.append((1, 10))
M.append((10, 100))
arrange_map = {} #记录给定i和j对应的最优分割k
C = np.zeros((N, N)).astype(int)
for i in range(N):
    for j in range(N):
        C[i][j] = -1
def  compute_c_table(C, i, j):
    if i < 0 or i >= N:
        return
    if j < 0 or j >= N:
        return
    if i == j:
        C[i][j] = 0
    if C[i][j] != -1:  #当前元素已经计算过
        return C[i][j]
    cost = sys.maxsize 
    best_k = i
    for k in range(i, j):
        first_part_cost = compute_c_table(C, i, k)
        second_part_cost = compute_c_table(C, k + 1, j)
        if first_part_cost + second_part_cost + M[i][0]*M[k][1]*M[j][1] < cost:
            cost = first_part_cost + second_part_cost + M[i][0]*M[k][1]*M[j][1]
            best_k = k 
    C[i][j] = int(cost) 
    arrange_map[(i, j)] = best_k
    return C[i][j]
compute_c_table(C, 0, N-1)
print(C)
print("the best computation time is: ", C[0][N-1])
def  print_best_matrix_arrange(arrange_map, i, j):
    if i == j:
        return "A{0}".format(i)
    if j == i + 1:
        return "(A{0}*A{1})".format(i, j)
    k = arrange_map[(i, j)]  #得到矩阵Ai到Aj连乘时的最优分割
    left = print_best_matrix_arrange(arrange_map, i, k)
    right = print_best_matrix_arrange(arrange_map, k+1, j)
    return "({0}*{1})".format(left, right)
arrangement = print_best_matrix_arrange(arrange_map, 0, N-1)
print("the best arrangement is :", arrangement)
相关推荐
人间打气筒(Ada)1 分钟前
如何基于 Go-kit 开发 Web 应用:从接口层到业务层再到数据层
开发语言·后端·golang
2501_924952694 分钟前
代码生成器优化策略
开发语言·c++·算法
wan9yu12 分钟前
为什么你需要给 LLM 的数据"加密"而不是"脱敏"?我写了一个开源工具
python
清风徐来QCQ15 分钟前
八股文(1)
java·开发语言
lsx20240618 分钟前
网站主机技术
开发语言
摇滚侠21 分钟前
你是一名 java 程序员,总结定义数组的方式
java·开发语言·python
xyq202430 分钟前
Vue3 条件语句详解
开发语言
这个名有人用不39 分钟前
解决 uv 虚拟环境使用 pip 命令提示command not found的办法
python·pip·uv·claude code
浩浩kids1 小时前
R•Homework
开发语言·r语言