用python实现了一个稀疏矩阵。
基本思想是3元组(行坐标、列坐标和值)描述矩阵。
将3元组保存在sqlite3的内存表里。
代码如下:
import sqlite3
class SparseMatrix:
def __init__(self, row_count=2147483647, column_count=2147483647):
self.db = sqlite3.connect(":memory:")
self.db.execute("CREATE TABLE 'matrix' ('x' integer, 'y' integer, 'value' real, primary key('x', 'y'));")
self.row = row_count
self.column = column_count
def __del__(self):
self.db.close()
def __getitem__(self, index):
if isinstance(index, tuple):
if len(index) == 2:
row,column = index
if row >= self.row or column >= self.column:
raise IndexError
cursor = self.db.execute("select value from matrix where x=? and y=?", index)
value = cursor.fetchone()
if value:
return value[0]
else:
return 0.0
else:
raise IndexError
else:
raise TypeError
def __setitem__(self, index, value):
row, column = index
if row >= self.row or column >= self.column:
raise IndexError
self.db.execute("insert or replace into matrix values(?,?,?)", (row, column, value))
def __add__(self, other): #self + other
if isinstance(other, SparseMatrix):
m = self.copy()
for r,c,v in other:
m[r,c] = self[r,c] + v
m.update()
return m
else:
raise TypeError
def __iadd__(self, other): #self += other
if isinstance(other, SparseMatrix):
if self.row != other.row or self.column != other.column:
raise IndexError
for row,column,value in other:
self[row,column] = self[row,column] + value
self.update()
return self
else:
raise TypeError
def __sub__(self, other):
if isinstance(other, SparseMatrix):
if self.row != other.row or self.column != other.column:
raise IndexError
m = self.copy()
for r,c,v in other:
m[r,c] = self[r,c] - v
m.update()
return m
else:
raise TypeError
def __mul__(self, other):
if isinstance(other, SparseMatrix):
m = SparseMatrix(self.row, other.column)
rows = self.getallrows()
columns = other.getallcolumns()
results = []
data = []
col_data = other.getcolumn(0)
for r in rows:
row_data = self.getrow(r)
for c in columns:
col_data = other.getcolumn(c)
pr = row_data.__iter__()
pc = col_data.__iter__()
rdata = pr.next()
cdata = pc.next()
while True:
try:
if rdata[0] == cdata[0]:
results.append(rdata[1] * cdata[1])
rdata = pr.next()
cdata = pc.next()
else:
if rdata[0] > cdata[0]:
cdata = pc.next()
else:
rdata = pr.next()
except StopIteration:
if results:
m[r,0] = sum(results)
results = list()
break
m.update()
return m
elif isinstance(other, int) or isinstance(other, float):
m = SparseMatrix(self.row, self.column)
for r,c,v in self:
m[r,c] = v * other
m.update()
return m
else:
raise TypeError
def __iter__(self):
cursor = self.db.execute("select x,y,value from matrix order by x,y")
for cell in cursor:
yield cell
def __len__(self):
cursor = self.db.execute("select count(*) from matrix")
return cursor.fetchone()[0]
def insert(self, cells):
for row,column,value in cells:
self[row, column] = value
self.update()
def copy(self):
m = SparseMatrix(self.row, self.column)
for r,c,v in self:
m[r,c] = v
return m
def getrow(self, row):
cursor = self.db.execute("select y,value from matrix where x=%d order by y" % row)
return cursor.fetchall()
def getcolumn(self, column):
cursor = self.db.execute("select x,value from matrix where y=%d order by x" % column)
return cursor.fetchall()
def getallrows(self):
rows = self.db.execute("select distinct x from matrix order by x").fetchall()
return zip(*rows)[0]
def getallcolumns(self):
columns = self.db.execute("select distinct y from matrix order by y").fetchall()
return zip(*columns)[0]
def update(self):
self.db.execute("DELETE FROM matrix where value between -0.0000001 and 0.0000001")
self.db.commit()
支持下表访问,支持矩阵的加法,减法和乘法运算,支持遍历。
如:
m1 = SparseMatrix()
m2 = SparseMatrix()
m1[0,0] = 1
m2[1,1] = 2
m = m1 + m2
for row,column,value in m:
print row,column,value
只是实现里功能,速度方面就比较头疼了。
做一个NxN的矩阵与N维向量的乘法用了大于6个小时(N=520000)。
还有一个支持多CPU并行乘法的版本,写的太难看,就不贴出来了。
不过有一个优点是不需要明确的知道矩阵的大小,在某些情况下还是有一些用处吧,我想。
分享到:
- 2009-07-29 11:49
- 浏览 1786
- 评论(4)
- 论坛回复 / 浏览 (4 / 4912)
- 查看更多
相关推荐
用sqlite实现学生成绩数据库的增删改查用sqlite实现学生成绩数据库的增删改查用sqlite实现学生成绩数据库的增删改查用sqlite实现学生成绩数据库的增删改查用sqlite实现学生成绩数据库的增删改查用sqlite实现学生成绩...
使用sqlite3所需要用到的库文件等
gcc使用的sqlite3数据库,sqlite3.a ,可以用于Dev-C++,也可以用于Windows下使用gcc编译的程序,sqlite版本是:3270200,还包含了sqlite3.lib库文件,可以用于visual studio。
sqlite3.h sqlite3头文件~~~~~~~
基于sqlite-amalgamation-3280000和wxsqlite3-3.3.1重编译版本,支持Sqlite3_key和Sqlite3_rekey方法
基于sqlite3的加密版本的数据库动态链接库,附lib和.h头文件,新测试可用。可设置密码和修改密码,加密后的数据库文件是无法被打开的。官方提供的免费版本sqlite3都是没有加密的,官方收费的很贵哦,有需要的朋友...
sqlite3 加密实现源码
sqlite3.exe是款强大的轻型数据库管理系统,它的设计目标是嵌入式的,目前在很多嵌入式产品中使用了它,占用资源低,支持Windows/Linux/Unix等等主流的操作系统,同时能跟很多程序语言相结合,如java,python,...
包括sqlite3.lib sqlite3.h sqlite3.dll sqlite3.exe
sqlite3 svn cleanup sqlite3 svn cleanup sqlite3 svn cleanup
课程设计基于python+pyqt5+sqlite3实现的图书信息管理系统源码+详细注释.zip课程设计基于python+pyqt5+sqlite3实现的图书信息管理系统源码+详细注释.zip课程设计基于python+pyqt5+sqlite3实现的图书信息管理系统源码...
已经生成的dll和lib文件,xp系统测试可用,Sqlite3_key和Sqlite3_rekey可用
因为使用Sqlite3.exe 自带的命令行方式,可能有不能修复的情况 如果不能修改的话,当出现【修复完毕】(界面模式)的对话框时不要点确定,打开修复文件夹找到.tmp文件 使用记事本打开,找到有没有 rollback 的命令,...
文件列表:1)sqlite3.h;...但是按照一些描述步骤总是生成失败,下面的资源是已经生成好的SQlite库及头文件,可以拿过来直接用,我的几个项目都是使用该库及头文件来完成的,具体的使用方法可以参考本人写的微博内容。
这是Android开发的一个例子,作为学习SQLite的一个样板。使用Android SQLite数据库实现联系人的增删改查功能,同时使用了ListView、Adapter来实现数据的列表显示,使用SearchView与Filter数据过滤器来实现搜索功能。
SQLITE3 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite3 是在世界上最广泛部署的 SQL 数据库引擎。SQLite3 源代码不受版权限制。
VB.NET 中使用 SQLite3 的演示代码
源码调用sqlite3.dll接口API实现SQLite3数据库操作。Tags:sqlite3。
3、解压所下载的两个压缩包,复制文件sqlite3.h、sqlite3.c、sqlite3.def、sqlite3ext.h到工程目录下; 这是32位,编好的lib,与32位的sqlite3.dll和sqlite3.h一起配置,就可以连接sqlite数据库
基于Qt4+sqlite3实现的通信录源代码,有兴趣的可以在此下载去学习。