稀疏矩阵相乘-Python版

                                      稀疏矩阵相乘-Python版

Given two sparse matrices A and B, return the result of AB.

You may assume that A's column number is equal to B's row number.

Example:

A = [
[ 1, 0, 0],
[-1, 0, 3]
]
B = [
[ 7, 0, 0 ],
[ 0, 0, 0 ],
[ 0, 0, 1 ]
]
| 1 0 0 | | 7 0 0 | | 7 0 0 |
AB = | -1 0 3 | x | 0 0 0 | = | -7 0 3 |
| 0 0 1 |

使用传统的矩阵相乘的算法肯定会处理大量的0乘0的无用功,所以我们适当的优化算法,我们知道一个 i x k 的矩阵A乘以一个 k x j 的矩阵B会得到一个 i x j 大小的矩阵C,那么我们来看结果矩阵中的某个元素C[i][j]是怎么来的,起始是A[i][0]*B[0][j] + A[i][1]*B[1][j] + ... + A[i][k]*B[k][j],那么为了不重复计算0乘0,我们首先遍历A数组,要确保A[i][k]不为0,才继续计算,然后我们遍历B矩阵的第k行,如果B[K][J]不为0,我们累加结果矩阵res[i][j] += A[i][k] * B[k][j]; 这样我们就能高效的算出稀疏矩阵的乘法,参见代码如下:

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 02 15:10:34 2018
@author: Administrator
"""
def SparseMatrixMultiply(A, B):#减少计算次数
res = [[0 for i in range(len(B[0]))] for j in range(len(A))]
for i in range(len(A)):
for j in range(len(A[0])):
if A[i][j] != 0:#non-zero
for k in range(len(B[0])):
if B[j][k] != 0:#non-zero
res[i][k] += A[i][j] * B[j][k]
return res
if __name__ == '__main__':
A = [[1,0,0],[-1,0,3]]
B = [[7,0,0],[0,0,0],[0,0,1]]
result = SparseMatrixMultiply(A, B)
print(result)

三元组方法

typedef struct NODE{ //定义稀疏矩阵结点       
 int i;       //行
 int j;       //列
 int data;   //值
} Node;
typedef struct MATRIX{ //定义稀疏矩阵(可以快速访问)       
 int mu, nu, tu;      // mu为矩阵行数,nu为矩阵列数,tu为矩阵中非零元素的个数
 Node matrix[MAXSIZE+1];       
 int rpos[MAXR+1];
} Matrix; 

算法时间复杂度为:O(A->tu*B->tu/B->mu)

此外还有十字链表法。

Python科学计算包scipy

import scipy as sp

a = sp.sparse.linalg.norm(S, 'fro')

转载于:https://www.cnblogs.com/AcceptedLin/p/9778834.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值