稀疏矩阵 part 3
▶ 各种稀疏矩阵数据结构下 y(n,1) = A(n,m) * x(m,1) 的实现,CPU版本
● MAT 乘法
int dotCPU(const MAT *a, const MAT *x, MAT *y)
{
checkNULL(a); checkNULL(x); checkNULL(y);
if (a->col != x->row)
{
printf("dotMATCPU dimension mismatch!\n");
return ;
} y->row = a->row;
y->col = x->col;
for (int i = ; i < a->row; i++)
{
format sum = ;
for (int j = ; j < a->col; j++)
sum += a->data[i * a->col + j] * x->data[j];
y->data[i] = sum;
}
COUNT_MAT(y);
return ;
}
● CSR 乘法
int dotCPU(const CSR *a, const MAT *x, MAT *y)
{
checkNULL(a); checkNULL(x); checkNULL(y);
if (a->col != x->row)
{
printf("dotCSRCPU dimension mismatch!\n");
return ;
} y->row = a->row;
y->col = x->col;
for (int i = ; i < a->row; i++) // i 遍历 ptr,j 遍历行内数据,A 中为 0 的元素不参加乘法
{
format sum = ;
for (int j = a->ptr[i]; j < a->ptr[i + ]; j++)
sum += a->data[j] * x->data[a->index[j]];
y->data[i] = sum;
}
COUNT_MAT(y);
return ;
}
● ELL 乘法
int dotCPU(const ELL *a, const MAT *x, MAT *y) // CPU ELL乘法
{
checkNULL(a); checkNULL(x); checkNULL(y);
if (a->colOrigin != x->row)
{
printf("dotELLCPU dimension mismatch!\n");
return ;
} y->row = a->col;
y->col = x->col;
for (int i = ; i<a->col; i++)
{
format sum = ;
for (int j = ; j < a->row; j++)
{
int temp = a->index[j * a->col + i];
if (temp < ) // 跳过无效元素
continue;
sum += a->data[j * a->col + i] * x->data[temp];
}
y->data[i] = sum;
}
COUNT_MAT(y);
return ;
}
● COO 乘法
int dotCPU(const COO *a, const MAT *x, MAT *y)
{
checkNULL(a); checkNULL(x); checkNULL(y);
if (a->col != x->row)
{
printf("dotCOOCPU null!\n");
return ;
} y->row = a->row;
y->col = x->col;
for (int i = ; i<a->count; i++)
y->data[a->rowIndex[i]] += a->data[i] * x->data[a->colIndex[i]];
COUNT_MAT(y);
return ;
}
● DIA 乘法
int dotCPU(const DIA *a, const MAT *x, MAT *y)
{
checkNULL(a); checkNULL(x); checkNULL(y);
if (a->colOrigin != x->row)
{
printf("dotDIACPU null!\n");
return ;
}
y->row = a->row;
y->col = x->col;
int * inverseIndex = (int *)malloc(sizeof(int) * a->col);
for (int i = , j = ; i < a->row + a->col - ; i++)
{
if (a->index[i] == )
{
inverseIndex[j] = i;
j++;
}
}
for (int i = ; i < a->row; i++)
{
format sum = ;
for (int j = ; j < a->col; j++)
{
if (i < a->row - - inverseIndex[j] || i > inverseIndex[a->col - ] - inverseIndex[j])
continue;
sum += a->data[i * a->col + j] * x->data[i + inverseIndex[j] - a->row + ];
}
y->data[i] = sum;
}
COUNT_MAT(y);
free(inverseIndex);
return ;
}
稀疏矩阵 part 3的更多相关文章
- [LeetCode] Sparse Matrix Multiplication 稀疏矩阵相乘
Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...
- 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
http://www.cnblogs.com/xbinworld/p/4273506.html 稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在9 ...
- poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化
题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...
- 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB
稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在90%甚至99%以上.因此我们需要有高效的稀疏矩阵存储格式.本文总结几种典型的格式:COO,CSR ...
- C语言 稀疏矩阵 压缩 实现
稀疏矩阵压缩存储的C语言实现 (GCC编译). /** * @brief C语言 稀疏矩阵 压缩 实现 * @author wid * @date 2013-11-04 * * @note 若代码存在 ...
- 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)
三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...
- 稀疏矩阵乘法加法等的java实现
原创声明:本文系作者原创,转载请写明出处. 一.前言 前几天由于科研需要,一直在搞矩阵的稀疏表示的乘法,不过最近虽然把程序写出来了,还是无法处理大规模的矩阵(虽然已经是稀疏了).原因可能是 ...
- Matlab稀疏矩阵
一.矩阵存储方式 MATLAB的矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式 将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中. 2.稀疏存储方式 仅存储矩阵所有的非零元 ...
- matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)
函数功能:生成稀疏矩阵 使用方法 :S = sparse(A) 将矩阵A转化为稀疏矩阵形式,即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S.如果A本身是稀疏的,sparse(S)返回S. S ...
- 稀疏矩阵coo_matrix的乘法
稀疏矩阵的乘法在做基于n-gram的分类的时候还是相当有用的,但是由于网上资料太少,所以折腾了几天才算折腾出来. 首先scipy包里常见的稀疏矩阵有三种形式, coo_matrix, csr_matr ...
随机推荐
- 函数模板前template语句的位置
先贴个例子看看: #include<iostream> using namespace std; template <> void print() { ; i < siz ...
- unity 面试题(答案)
一.什么是渲染管道?是指在显示器上为了显示出图像而经过的一系列必要操作.渲染管道中的很多步骤,都要将几何物体从一个坐标系中变换到另一个坐标系中去.主要步骤有:本地坐标->视图坐标->背面裁 ...
- MySQL下载与安装
百度云网盘: https://pan.baidu.com/s/11ZIuXcNowp4_bVH4FLhyYA 提取码:ocuh MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发, ...
- Web前端学习第三天(cookie 二)
HttpOniy Cookie机制 在http层面传输cookie,当设置HttpOnly标志后,客户端脚本就无法读写该cookie.可以用此防止xss攻击获取cookie <?php setc ...
- Spark菜鸟记录
1.RDD[(k,v)] join()优化,join之前会对两个RDD的key做hash,通过网络把相同hash值的数据传到同一个节点,因此对多次join的RDD 做预分区与持久化可提高效率. map ...
- C++ 状态机接口
最近的状态极差,甚至代码也写不下去了.给自己手臂上的两刀没有任何的作用,看来早已经是麻痹了. 一直想弄一个勉强能用的状态机,用于在各种涉及到状态转换的时候用到,然而脑子并不是太清醒. 先放在这里一个接 ...
- zabbix自动发现及其自动注册
在大企业环境中,不可能在zabbix页面上逐个添加被监控的主机.还好zabbix自带自动发现和自动注册功能 被监控端安装zabbix客户端之后,将配置文件配置指向服务器端ip即可.红色箭头改为zabb ...
- apache做反向代理
实验目的 通过apache实现反向代理的功能,类似nginx反向代理和haproxy反向代理 环境准备 逻辑架构如下 前端是apche服务器,监听80端口,后端有两台web服务器,分别是node1和n ...
- 使用QTP12.2录制windows applications,没有脚本产生
使用QTP12.2录制windows applications,没有脚本产生解决方案:关闭电脑的杀毒软件和安全卫士,再进行录制,所有步骤录制成功.录制QTP自带程序flight,选择windows a ...
- layui select 选完其他选项, 手工清空选项 又恢复最初的选项?
启用layui的select 下拉搜索项: lay-search <div class="layui-inline"> <label class="l ...