▶ 各种稀疏矩阵数据结构下 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的更多相关文章

  1. [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 ...

  2. 转载:稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB

    http://www.cnblogs.com/xbinworld/p/4273506.html 稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在9 ...

  3. poj 3735 Training little cats 矩阵快速幂+稀疏矩阵乘法优化

    题目链接 题意:有n个猫,开始的时候每个猫都没有坚果,进行k次操作,g x表示给第x个猫一个坚果,e x表示第x个猫吃掉所有坚果,s x y表示第x个猫和第y个猫交换所有坚果,将k次操作重复进行m轮, ...

  4. 稀疏矩阵存储格式总结+存储效率对比:COO,CSR,DIA,ELL,HYB

    稀疏矩阵是指矩阵中的元素大部分是0的矩阵,事实上,实际问题中大规模矩阵基本上都是稀疏矩阵,很多稀疏度在90%甚至99%以上.因此我们需要有高效的稀疏矩阵存储格式.本文总结几种典型的格式:COO,CSR ...

  5. C语言 稀疏矩阵 压缩 实现

    稀疏矩阵压缩存储的C语言实现 (GCC编译). /** * @brief C语言 稀疏矩阵 压缩 实现 * @author wid * @date 2013-11-04 * * @note 若代码存在 ...

  6. 三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述)

    三元组表压缩存储稀疏矩阵实现稀疏矩阵的快速转置(Java语言描述) 用经典矩阵转置算法和普通的三元组矩阵转置在时间复杂度上都是不乐观的.快速转置算法在增加适当存储空间后实现快速转置具体原理见代码注释部 ...

  7. 稀疏矩阵乘法加法等的java实现

    原创声明:本文系作者原创,转载请写明出处. 一.前言       前几天由于科研需要,一直在搞矩阵的稀疏表示的乘法,不过最近虽然把程序写出来了,还是无法处理大规模的矩阵(虽然已经是稀疏了).原因可能是 ...

  8. Matlab稀疏矩阵

    一.矩阵存储方式 MATLAB的矩阵有两种存储方式,完全存储方式和稀疏存储方式 1.完全存储方式 将矩阵的全部元素按列存储,矩阵中的全部零元素也存储到矩阵中. 2.稀疏存储方式 仅存储矩阵所有的非零元 ...

  9. matlab——sparse函数和full函数(稀疏矩阵和非稀疏矩阵转换)

    函数功能:生成稀疏矩阵 使用方法 :S = sparse(A) 将矩阵A转化为稀疏矩阵形式,即矩阵A中任何0元素被去除,非零元素及其下标组成矩阵S.如果A本身是稀疏的,sparse(S)返回S. S ...

  10. 稀疏矩阵coo_matrix的乘法

    稀疏矩阵的乘法在做基于n-gram的分类的时候还是相当有用的,但是由于网上资料太少,所以折腾了几天才算折腾出来. 首先scipy包里常见的稀疏矩阵有三种形式, coo_matrix, csr_matr ...

随机推荐

  1. java反射2

    package com.wen; import java.lang.reflect.Field;import java.lang.reflect.Method; public class Test2 ...

  2. vue cli3.0配制axios代理

    今天学习时,想访问网易新闻接口,结果显而易见,因为跨域被浏览器拒绝了. 去网上找一下结果一开始找到的是2.x版本的配置,生硬的放进去,给我各种报错.编译阶段就炸了.浪费好多时间 再按3.0版本去搜索才 ...

  3. 二维数组 \n是换行 三目运算符 if语句示例

    今天学习了二维数组 // 1.定义数组array并赋值 // var arr1=[1,2,3,4,5,]; // alert(arr1[2]); 数组的长度就是值的多少 获取数值的长高度=最大下标+1 ...

  4. Python基础:九、运算符

    一.赋值运算 简单的赋值运算符号:= c = a + b #将a+b的元算结果赋值给c 加法赋值运算符:+= c += a #等效于 c = c + a 减法赋值运算符:-= c -= a #等效于 ...

  5. python面试题--数据类型

    数据类型 字典 dict:字典,字典是一组键(key)和值(value)的组合,通过键(key)进行查找,没有顺序, 使用大括号”{}”;应用场景:dict,使用键和值进行关联的数据; 现有字典d={ ...

  6. 我发起并创立了一个 EPWA 的 开源项目

    EPWA ,  是  Easy PWA  的 意思, PWA 取自于 Google 的 PWA, EPWA   是一个用   C#  Cef  Html  js  css   开发 桌面程序 的 架构 ...

  7. MGR实现分析 - 成员管理与故障恢复实现

    MySQL Group Replication(MGR)框架让MySQL具备了自动主从切换和故障恢复能力,举single primary(单主)模式为例,primary作为主节点对外提供读写服务,是唯 ...

  8. QQ浏览器中时区bug

    在QQ浏览器 4.4.119.400 版本中,通过new Date('2018-11-11').getTime(); 获取的时间不是东8区的时间戳,而是0时区的时间戳,这就导致了获取的时间与实际的时间 ...

  9. 18.25 JLink调试程序步骤

    S3C2440开发板启动时候选择NandFlash启动,然后输入如下命令: r                                 /*复位cpu*/ h                  ...

  10. 学习Xposed --记WX功能分析的过程

    首先,这个不是写个新手看的,内容比较粗略,把几个关键点自己列一下,以做记录 首先,我对andriod不懂,对java本身也不是非常熟,也从来没写过andriod或java的程序,但本着曾经对编程的理解 ...