当前位置: 首页 > news >正文

稀疏矩阵的存储与计算 gaxpy

1, gaxpy 数学公式

\mathbf{y = y+Ax}
 

其中:     \mathbf{A} \in \mathbf{R}^{m \times n}  ,\mathbf{y} \in \mathbf{R}^m\mathbf{x}\in \mathbf{R}^n


2, 具体实例

\mathbf{A}= \left[ \begin{array}{ccccc} 1&0&0&2&0\\ 0&0&3&0&1\\ 0&0&2&0&0\\ 7&0&0&5&0\\ 0&9&0&0&2\\ 0&0&1&0&8\\ \end{array} \right]

         \mathbf{x}= \left[ \begin{array}{ccccc} 1&0&3&0&7\\ \end{array} \right]

\mathbf{y}= \left[ \begin{array}{c} 0\\ 3\\ 0\\ 2\\ 0\\ 1\\ \end{array} \right]    

3,用稠密矩阵的方法

本节将用于验证第4节中的稀疏计算的结果

hello_gaxpy_dense.cpp

#include <stdio.h>
#include <stdlib.h>struct Matrix_SP
{float* val;   // 矩阵中非零元素,按列收集在一起;int* c;         // 某列非零元素开始的index in val[...];int* r;          // val中每个元素的行号;int M;int N;
};void gen_sparse_matrix(int m, int n, float* A, int lda)
{//step1, randomfor(int i=0; i<m; i++){for(int j=0; j<n; j++){if((1.0*rand())/RAND_MAX < 0.6f)A[i + j*lda] = 0.0f;elseA[i + j*lda] = (1.0*rand())/RAND_MAX;}}
}void print_matrix(int m, int n, float* A, int lda)
{for(int i=0; i<m; i++){for(int j=0; j<n; j++){printf(" %7.4f", A[i + j*lda]);}printf("\n");}
}void gemm_cc(int M, int N, int K, float alpha, float*A, int lda, float* B, int ldb, float beta, float* C, int ldc)
{for(int i=0; i<M; i++){for(int j=0; j<N; j++){float sigma = 0.0f;for(int k=0; k<K; k++){sigma += A[i + k*lda]*B[k + j*ldb];}C[i + j*ldc] = alpha*sigma + beta*C[i + j*ldc];}}
}int main()
{int m = 6;int n = 5;int lda = m;// y and x are column vector;//y(6) = y(6) + A(6,5) * x(5)^t;float* y = NULL;float* x = NULL;float* A = NULL;A = (float*)malloc(lda*n*sizeof(float));y = (float*)malloc(m*sizeof(float));x = (float*)malloc(n*sizeof(float));//step 0, gen dense matrix;gen_sparse_matrix(m, n, A, lda);print_matrix(m, n, A, lda);//step 1, make dense matrix sparse;//step 2, gen y;//step 3, gen x;//step 4, dense gaxpy// 4.1 tmp = Ax;//4.2 y = y + tmp;//step 5, sparse gaxpy// 5.1 tmp = Ax// 5.2 y = y + tmp;free(A);free(y);free(x);return 0;
}

Makefile


all: g.outg.out: hello_dense_sparse_gaxpy.cppg++ -g $< -o $@.PHONY: clean
clean:-rm -rf g.out

4,用稀疏矩阵的方法

存储A

4.1 压缩列表示法

struct Matrix_SP
{float* val;   // 矩阵中非零元素,按列收集在一起;int* c;         // 某列非零元素开始的index in val[...];int* r;          // val中每个元素的行号;int M;int N;
};

struct Matrix_SP 用于存储一个稀疏矩阵;

现在来用它存储 第2节 中的A矩阵;

4.2 稀疏 gemv 计算


http://www.mrgr.cn/news/80939.html

相关文章:

  • HTML学习之CSS三种引入方式
  • kafka生产者之发送模式与ACK
  • node 程序占用处理方法与后台运行方法
  • 背包问题1
  • 【蓝桥杯嵌入式】SysTick滴答定时器
  • Windows系统中Docker可视化工具对比分析,Docker Desktop,Portainer,Rancher
  • Spring Cloud Gateway 源码
  • CogVideoX: Text-to-Video Diffusion Models with An Expert Transformer 论文解读
  • Linux shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式后,并添加文本水印
  • 【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
  • 游戏开发技能系统常用概念
  • 云计算HCIP-OpenStack02
  • 基础2:值类型与右值引用
  • redo log 和 undo log
  • 实现 WebSocket 接入文心一言
  • Golang学习历程【第二篇 fmt包变量、常量的定义】
  • aosp15 - App冷启动
  • 编译原理复习---基本概念+推导树
  • 云计算HCIP-OpenStack01
  • 滴滴的logicFlow流程图组件
  • 通过smem 定时检测系统内存占用情况
  • uniapp Native.js 调用安卓arr原生service
  • Ubuntu 上传项目到 GitHub
  • windwos defender实现白名单效果(除了指定应用或端口其它一律禁止)禁止服务器上网
  • 我在广州学 Mysql 系列——有关 Mysql 函数的练习
  • Mysql语法之DQL查询的多行函数