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

IGraph使用实例——线性代数计算(blas)

 1 概述

在图论中,BLAS(Basic Linear Algebra Subprograms)并不直接应用于图论的计算,而是作为一套线性代数计算中通用的基本运算操作函数集合,用于进行向量和矩阵的基本运算。然而,这些基本运算在图论的相关计算中可能会被用到,尤其是涉及到矩阵运算的时候。

BLAS主要包含以下三个级别的函数:

  1. Level 1 BLAS函数
    • 处理单一向量的线性运算,如向量的加、减、数乘等。
    • 处理两个向量的二元运算,如点积、向量外积等。
  2. Level 2 BLAS函数
    • 处理矩阵与向量的运算,如矩阵与向量的乘积、矩阵的秩1更新等。
    • 包含线性方程求解计算,如使用高斯消元法解线性方程组。
  3. Level 3 BLAS函数
    • 包含矩阵与矩阵的运算,如矩阵乘法、矩阵的三角分解等。

在图论中,如果涉及到矩阵表示的图(如邻接矩阵)、线性方程组的求解(如网络流问题中的势能法)或者特征值问题(如图的谱分析)等,就可能会使用到BLAS库中的函数。

2 运行环境

操作系统:win10 64位

编程语言:C/C++

编译平台:vs2019  x64 debug | release

igraph版本: 0.10.12

3 示例代码

在IGraph中的blas.c文件中提供了丰富的功能来处理图和网络数据结构。这个特定的文件包含了一些使用BLAS(Basic Linear Algebra Subprograms)库的函数,用于执行线性代数操作,如矩阵-向量乘法、矩阵-矩阵乘法、向量的欧几里得范数计算和向量的点积。

文件中定义了几个函数,每个函数都与特定的线性代数操作相关:

  1. igraph_blas_dgemv:执行矩阵-向量乘法,使用BLAS库中的dgemv函数。它支持矩阵的转置操作,并允许用户指定alpha和beta系数。

  2. igraph_blas_dgemm:执行矩阵-矩阵乘法,使用BLAS库中的dgemm函数。它同样支持矩阵的转置操作,并允许用户指定alpha和beta系数。

  3. igraph_blas_dgemv_array:与igraph_blas_dgemv类似,但是它接受C语言数组作为输入,而不是IGraph库中的向量对象。

  4. igraph_blas_dnrm2:计算向量的欧几里得范数,使用BLAS库中的dnrm2函数。

  5. igraph_blas_ddot:计算两个向量的点积,使用BLAS库中的ddot函数。

3.1 示例1

 在下列代码中使用了igraph库,特别是它的线性代数部分(通过igraph_blas函数集)来进行一些基本的矩阵和向量运算。

#include <igraph.h>  // 引入igraph库的头文件  int main(void) {  // 定义igraph的矩阵和向量对象  igraph_matrix_t m;  igraph_vector_t x, y, z;  igraph_real_t xz, xx;  // 用于存储计算结果的两个实数变量  // 初始化向量x,包含3个元素,分别为1.0, 2.0, 3.0  igraph_vector_init_real(&x, 3, 1.0, 2.0, 3.0);  // 初始化向量y,包含4个元素,分别为4.0, 5.0, 6.0, 7.0  // 注意:虽然y之后会被用于计算,但这里先初始化为一些值  igraph_vector_init_real(&y, 4, 4.0, 5.0, 6.0, 7.0);  // 初始化向量z,包含3个元素,分别为-1.0, 0.0, 0.5  igraph_vector_init_real(&z, 3, -1.0, 0.0, 0.5);  // 初始化一个4x3的矩阵m,并为其赋值  igraph_matrix_init(&m, 4, 3);  // 填充矩阵m的元素  MATRIX(m, 0, 0) = 1;MATRIX(m, 0, 1) = 2;MATRIX(m, 0, 2) = 3;MATRIX(m, 1, 0) = 2;MATRIX(m, 1, 1) = 3;MATRIX(m, 1, 2) = 4;MATRIX(m, 2, 0) = 3;MATRIX(m, 2, 1) = 4;MATRIX(m, 2, 2) = 5;MATRIX(m, 3, 0) = 4;MATRIX(m, 3, 1) = 5;MATRIX(m, 3, 2) = 6;// 计算 2 * m.x + 3 * y,并将结果存储在y中  // 注意:这里的操作会改变y的内容  igraph_blas_dgemv(/* transpose= */ 0, /* alpha= */ 2, &m, &x, /* beta= */ 3, &y);  // 打印向量y的新内容  igraph_vector_print(&y);  // 计算向量x的模的平方(即x与自身的点积),存储在xx中  igraph_blas_ddot(&x, &x, &xx);  // 计算向量x和z的点积,存储在xz中  igraph_blas_ddot(&x, &z, &xz);  // 打印结果  printf("x.x = %g, x.z = %g\n", xx, xz);  // 销毁之前创建的矩阵和向量对象,释放内存  igraph_matrix_destroy(&m);  igraph_vector_destroy(&z);  igraph_vector_destroy(&y);  igraph_vector_destroy(&x);  return 0;  
}

3.2 示例2

 以下代码使用BLAS(Basic Linear Algebra Subprograms)库中的dgemm(Double-precision General Matrix Multiply)函数来执行两个矩阵的乘法,并将结果存储在第三个矩阵中。

// 引入igraph库的头文件  
#include <igraph.h>  int main(void) {  // 声明三个igraph_matrix_t类型的变量a, b, c,用于存储矩阵  igraph_matrix_t a, b, c;  // 初始化一个2x2的矩阵a,并为其分配内存  igraph_matrix_init(&a, 2, 2);  // 设置矩阵a的元素  MATRIX(a, 0, 0) = 1;  // a[0][0] = 1  MATRIX(a, 0, 1) = 2;  // a[0][1] = 2  MATRIX(a, 1, 0) = 3;  // a[1][0] = 3  MATRIX(a, 1, 1) = 4;  // a[1][1] = 4  // 初始化一个2x2的矩阵b,并为其分配内存  igraph_matrix_init(&b, 2, 2);  // 设置矩阵b的元素  MATRIX(b, 0, 0) = 5;  // b[0][0] = 5  MATRIX(b, 0, 1) = 6;  // b[0][1] = 6  MATRIX(b, 1, 0) = 7;  // b[1][0] = 7  MATRIX(b, 1, 1) = 8;  // b[1][1] = 8  // 初始化一个2x2的矩阵c,用于存储a和b的乘法结果  igraph_matrix_init(&c, 2, 2);  // 使用igraph_blas_dgemm函数计算a和b的乘积,并将结果乘以0.5后存储在c中  // 第一个和第二个参数分别是矩阵a和b的alpha(这里是1,即不缩放)  // 第三个参数是缩放因子(这里是0.5)  // 第四和第五个参数是矩阵a和b的指针  // 第六个参数是矩阵c的beta(这里是0,即不使用c的原始值)  // 第七个参数是结果矩阵c的指针  igraph_blas_dgemm(1, 1, 0.5, &a, &b, 0, &c);  // 打印矩阵c的内容  igraph_matrix_printf(&c, "%g");  // 释放矩阵a, b, c所占用的内存  igraph_matrix_destroy(&a);  igraph_matrix_destroy(&b);  igraph_matrix_destroy(&c);  // 程序正常退出  return 0;  
}

4 运行结果

4.1 结果1

首先,我们初始化了几个向量xyz和一个矩阵m。然后为矩阵m赋值了一个4x3的矩阵。

在第一个igraph_blas_dgemv函数调用中,我们试图计算2 * m * x + 3 * y并将结果存储在y中。但是,请注意,由于igraph_blas_dgemv的默认操作是y = alpha * A * x + beta * y(其中A是矩阵,xy是向量,alphabeta是标量),因此,实际上是在更新y的值,而不是简单地计算结果。由于y的初始值不为零,这会影响最终结果。

y向量初始化为[4.0, 5.0, 6.0, 7.0]。在调用igraph_blas_dgemv后,y将被更新为2 * m * x + 3 * y

矩阵m与向量x的乘法结果是一个4x1的向量,其值为[1*1 + 2*2 + 3*3, 2*1 + 3*2 + 4*3, 3*1 + 4*2 + 5*3, 4*1 + 5*2 + 6*3],即[14, 20, 26, 32]

然后,我们将这个结果与y的初始值相加,并乘以相应的系数:

  • y[0] 变为 2 * 14 + 3 * 4.0 = 28 + 12 = 40
  • y[1] 变为 2 * 20 + 3 * 5.0 = 40 + 15 = 55
  • y[2] 变为 2 * 26 + 3 * 6.0 = 52 + 18 = 70
  • y[3] 变为 2 * 32 + 3 * 7.0 = 64 + 21 = 85

因此,y向量的最终值是[40, 55, 70, 85]

接下来,我们使用igraph_blas_ddot来计算xx的点积(即x.x),以及xz的点积(即x.z)。这些计算的结果是:

  • x.x 是 [1.0, 2.0, 3.0] 与 [1.0, 2.0, 3.0] 的点积,即 1*1 + 2*2 + 3*3 = 14
  • x.z 是 [1.0, 2.0, 3.0] 与 [-1.0, 0.0, 0.5] 的点积,即 1*(-1) + 2*0 + 3*0.5 = -1 + 1.5 = 0.5

因此输出x.x = 14, x.z = 0.5

4.2 结果2 

根据矩阵乘法的定义和给定的代码,矩阵ab的乘积再乘以0.5会得到矩阵c,其元素计算如下:

a = [1 2; 3 4]

b = [5 6; 7 8]

c = 0.5 * (a * b)

矩阵乘法a * b的结果为:

[1*5 + 2*7 1*6 + 2*8; 3*5 + 4*7 3*6 + 4*8] = [1 + 14 6 + 16; 15 + 28 18 + 32] = [15 22; 43 50]

然后,我们将这个结果乘以0.5得到矩阵c

c = [15*0.5 22*0.5; 43*0.5 50*0.5] = [7.5 11; 21.5 25]

最后程序执行结果如下:

11.5 15.5

17 23

相关文章:

IGraph使用实例——线性代数计算(blas)

1 概述 在图论中&#xff0c;BLAS&#xff08;Basic Linear Algebra Subprograms&#xff09;并不直接应用于图论的计算&#xff0c;而是作为一套线性代数计算中通用的基本运算操作函数集合&#xff0c;用于进行向量和矩阵的基本运算。然而&#xff0c;这些基本运算在图论的相…...

【MySQL】(基础篇五) —— 排序检索数据

排序检索数据 本章将讲授如何使用SELECT语句的ORDER BY子句&#xff0c;根据需要排序检索出的数据。 排序数据 还是使用上一节中的例子,查询employees表中的last_name字段 SELECT last_name FROM employees;输出结果&#xff1a; 发现其输出并没有特定的顺序。其实&#xf…...

C++ C_style string overview and basic Input funcitons

write in advance 最近在做题&#xff0c;遇到一个简单的将console的输入输出到文件中的简单题目&#xff0c;没有写出来。悔恨当初没有踏实地总结string 相关的 I/O 以及与文件的操作。这篇文章旨在记录基础的字符I/O, 简单常用的文件I/O操作函数。 当然&#xff0c;你会说C…...

VS2022+Qt雕刻机单片机马达串口上位机控制系统

程序示例精选 VS2022Qt雕刻机单片机马达串口上位机控制系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《VS2022Qt雕刻机单片机马达串口上位机控制系统》编写代码&#xff0c;代码整洁&a…...

Android Ble低功耗蓝牙开发

一、新建项目 在Android Studio中新建一个项目&#xff0c;如下图所示&#xff1a; 选择No Activity&#xff0c;然后点击Next 点击Finish&#xff0c;完成项目创建。 1、配置build.gradle 在android{}闭包中添加viewBinding&#xff0c;用于获取控件 buildFeatures {viewB…...

Visual Studio的快捷按键

Visual Studio的快捷按键对于提高编程效率至关重要。以下是一些常用的Visual Studio快捷按键&#xff0c;并按照功能进行分类和归纳&#xff1a; 1. 文件操作 Ctrl O&#xff1a;打开文件Ctrl S&#xff1a;保存文件Ctrl Shift S&#xff1a;全部保存Ctrl N&#xff1a;…...

【WEB系列】过滤器Filter

Filter&#xff0c;过滤器&#xff0c;属于Servlet规范&#xff0c;并不是Spring独有的。其作用从命名上也可以看出一二&#xff0c;拦截一个请求&#xff0c;做一些业务逻辑操作&#xff0c;然后可以决定请求是否可以继续往下分发&#xff0c;落到其他的Filter或者对应的Servl…...

[书生·浦语大模型实战营]——LMDeploy 量化部署 LLM 实践

1.基础作业 1.1配置 LMDeploy 运行环境 创建开发机 创建新的开发机&#xff0c;选择镜像Cuda12.2-conda&#xff1b;选择10% A100*1GPU&#xff1b;点击“立即创建”。注意请不要选择Cuda11.7-conda的镜像&#xff0c;新版本的lmdeploy会出现兼容性问题。其他和之前一样&…...

TiDB-从0到1-配置篇

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇 一、系统配置 TiDB的配置分为系统配置和集群配置两种。 其中系统配置对应TiDB Server&#xff08;不包含TiKV和PD的参数&#xff0…...

微信小程序按钮设计与交互:打造极致用户体验

微信小程序作为一种流行的应用形式&#xff0c;其界面设计和交互体验对于用户吸引力和留存率至关重要。其中&#xff0c;按钮作为用户与小程序进行交互的主要方式之一&#xff0c;其设计和实现直接影响到用户体验的质量。在本文中&#xff0c;我们将探讨微信小程序按钮的设计与…...

ES6中如何使用class和extends关键字实现继承?

在ES6中&#xff0c;可以使用class关键字来定义类&#xff0c;使用extends关键字来实现继承。下面是一个示例&#xff1a; // 父类 class Parent {constructor(name) {this.name name;}sayHello() {console.log(Hello, my name is ${this.name});} }// 子类 class Child ex…...

Linux:基本指令

文章目录 ls指令pwd指令cd指令touch指令mkdir指令rmdir指令 && rm指令cp指令man指令echo指令输出重定向追加重定向 cat指令输入重定向 mv指令which指令alias指令more && less指令head && tail指令事件相关的指令date显示时间戳 cal指令find指令grep指令…...

商业C++静态代码检测工具PC-lint Plus 、 polysace和sonarqube对比

商业C静态代码检测工具PC-lint Plus 、 polysace和sonarqube对比 特性/工具PC-lint PlusPolyspaceSonarQube主要功能高精度静态代码分析、编码标准检查高级静态分析和形式验证、优化嵌入式系统综合性代码质量管理、静态分析、技术债务管理集成方式可集成到IDE和构建系统与开发…...

邬家桥公园

文&#xff5c;随意的风 原文地址 我游览过现存规模最大、保存最完整的皇家园林颐和园&#xff0c;瞻仰过拥有世界上最大祭天建筑群的天坛公园&#xff0c;那都是多年前的事情了。 邬家桥公园相比颐和园、天坛公园&#xff0c;气势雄伟倒谈不上。它没有西湖的水平如镜&#xff…...

Flutter 中的 RenderObjectToWidgetAdapter 小部件:全面指南

Flutter 中的 RenderObjectToWidgetAdapter 小部件&#xff1a;全面指南 Flutter 是一个功能强大的 UI 框架&#xff0c;由 Google 开发&#xff0c;允许开发者使用 Dart 语言构建跨平台的移动、Web 和桌面应用。在 Flutter 的渲染体系中&#xff0c;RenderObjectToWidgetAdap…...

SNAT与DNAT

一、SNAT策略概述 1、SNAT 策略的典型应用环境 局域网主机共享单个公网IP地址接入Internet&#xff08;私有IP不能在Internet中正常路由&#xff09; 局域共享上网 2、 SNAT 策略的原理 修改数据包的源地址 把从内网 --> 外网的数据的源内网地址转换成公网源地址 3、SN…...

MySql八股文知识点总结,一篇文章让mysql成为面试加分项

MySql八股文知识点总结&#xff08;自检&#xff09; 1.前言 参与了几次中大厂的面试&#xff0c;你会发现一面时对于八股文的考察也具有侧重点&#xff08;MySQLRedis > 网络 > 系统 >设计模式 > java集合 >spring) 本文的目标就是通过这一篇文章让你能在面…...

Python 很好用的爬虫框架:Scrapy:

了解Scrapy 爬虫框架的工作流程&#xff1a; 在scrapy中&#xff0c; 具体工作流程是这样的&#xff1a; 首先第一步 当爬虫引擎<engine>启动后&#xff0c; 引擎会到 spider 中获取 start_url<起始url> 然后将其封装为一个request对象&#xff0c; 交给调度器<…...

C/C++|关于 namespace 在C++中的代码组织

命名空间&#xff08;namespace&#xff09;在C中用于组织代码&#xff0c;避免命名冲突&#xff0c;并提供更好的代码结构和可读性。下面详细解释命名空间在C多文件编写中的各种作用和表达。 基本概念 命名空间是一个声明区域&#xff0c;用于组织代码&#xff0c;防止不同部…...

selenium自动化测试入门 —— 上传文件

selenium无法识别非web的控件&#xff0c;上传文件窗口为系统自带&#xff0c;无法识别窗口元素。 上传文件有两种场景&#xff1a;input控制上传和非input控件上传。 大多数情况都是input控件上传文件&#xff0c;只有非常少数的使用自定义的非input上传文件。 一、input控…...

C# Math.Round() 四舍六入五取偶

文章目录 1.重载列表2. 示例 Math.Round() 为四舍六入五取偶 1.重载列表 API说明Round(Double)将小数值舍入到最近的整数值Round(Double, Int32)将小数值按指定的小数位数舍入Round(Double, Int32, MidpointRounding)将小数值按指定的小数位数舍入&#xff0c;MidpointRoundin…...

springboot手动触发参数校验,service层调用参数校验

背景 入参校验一般是在控制层通过javax.validation.constraints包下的规则注解如NotNull结合Valid与Validated实现&#xff0c;但是有时候我们的方法不提供给controller调用&#xff0c;这时候就无法触发自动参数校验&#xff0c;为此我们可以在不更改校验代码的前提下手动触发…...

动手学深度学习4.10 实战Kaggle比赛:预测房价-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;实战 Kaggle 比赛&#xff1a;预测房价_哔哩哔哩_bilibili 本节教材地址&#xff1a;4.10. 实战Ka…...

1035 插入与归并(测试点6)

solution 类型判断&#xff1a;插入排序中已排序的部分有序&#xff0c;未排序的和原数组元素相同&#xff1b;否则为归并排序测试点6&#xff1a;对于归并排序的子序列长度&#xff0c;不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…...

什么情况下需要使用分布式事务,有哪些方案?

引言&#xff1a;在当今的分布式系统中&#xff0c;数据的一致性和事务的处理成为了关键问题。随着应用程序的规模不断扩大和复杂性的增加&#xff0c;单一数据库事务的能力已经无法满足需求。因此&#xff0c;引入了分布式事务的概念&#xff0c;以确保跨多个节点的操作能够保…...

Java加密体系结构参考指南-Java Cryptography Architecture

本文是从英文的官网摘了翻译的&#xff0c;用作自己的整理和记录。水平有限&#xff0c;欢迎指正。版本是&#xff1a;22 原文地址&#xff1a;https://docs.oracle.com/en/java/javase/22/security/java-cryptography-architecture-jca-reference-guide.html#GUID-815542FE-CF…...

C++中避免内存泄漏的方法

在C++中,内存泄漏是一个常见的问题,它发生在程序申请了一块内存后,没有正确地释放它。这会导致程序运行时间越长,内存占用越大,最终可能导致系统崩溃。为了避免内存泄漏,你可以遵循以下一些策略: 正确使用new和delete:当你使用new操作符动态分配内存时,确保在不再需要…...

5.1 实体完整性

一个表只能有一个主键约束&#xff0c;且主键约束不能取空值。 通过unique约束定义唯一性&#xff0c;为了保证一个表非主键列不输入重复值&#xff0c;可在该列定义unique约束。 primary key约束与unique约束主要区别如下。 (1)一个表只能创建一个primary key约束&#xff0…...

(学习笔记)数据基建-数据质量

数据基建-数据质量 数据质量数据质量保障措施如何推动上下游开展数据质量活动数据质量保障如何量化产出数据质量思考全链路数据质量保障项目 数据质量 概念&#xff1a;数据质量&#xff0c;意如其名&#xff0c;就是数据的准确性&#xff0c;他是数据仓库的基石&#xff0c;控…...

WINUI——Behavior(行为)小结

前言 在使用MVVM进行WINUI或WPF开发时&#xff0c;Command在某些时候并不能满足逻辑与UI分离的要求。这时肯定就需要其它技术的支持&#xff0c;Behavior就是一种。在WPF中是有Behavior直接支持的&#xff0c;转到WINUI后&#xff0c;相对有一些麻烦&#xff0c;于是在此记录之…...

厦门电子商务网站建/网页广告

ConcurrentHashMap是一种线程安全的hashmap,相对于HashTable, 它拥有更高的并发性. 现在,我们就来分析一下在JDK1.8下的ConcurrentHashMap的实现及原理: get()方法 public V get(Object key) {Node<K,V>[] tab; Node<K,V> e, p; int n, eh; K ek;int h spread(ke…...

在哪个网站做流程图比较好看/青岛快速排名优化

问题复现&#xff1a;Your CPU does not support VT-x 按照官方步骤&#xff0c;下载安装完成后&#xff0c;在运行模拟器的时候&#xff0c;发现提示CUP不支持VT-x&#xff0c;原因是M1芯片和现在的as版本或avd 组件不兼容。 卸载之前的安装&#xff0c;重新开始 1、选择一个…...

手机做网站用什么软件/营销百度app下载手机版

在本文中,我们将对比Articulate和iSpring Suite,将揭示产品的优缺点,以便您确定最适合您的产品。iSpring Suite是一个新兴的创作工具包,也许您不太了解iSpring Suite,那您就可以看看这篇文章。 iSpring安装程序是.msi文件。.exe文件用作完整.msi安装程序的自动下载程序,还…...

一个网站开发环境是什么/广告投放代理商加盟

AOF&#xff08;Append Only File&#xff09; 一、是什么 以日志的形式来记录每个写操作&#xff0c;将Redis执行过的所有写指令记录下来(读操作不记录)&#xff0c;只许追加文件但不可以改写文件&#xff0c;redis启动之初会读取该文件重新构建数据&#xff0c;换言之&#x…...

北京移动端网站开发/青岛seo排名公司

15版默认关闭三指拖动窗口&#xff0c;需要按住后再移动。 设置开启 三指拖动窗口功能如下&#xff1a; 左上角点击小苹果&#xff0c;系统偏好设置&#xff0c;第四行找到‘辅助功能’ 辅助功能&#xff0c;左侧列表里&#xff0c;找到‘鼠标与触控板’&#xff0c;右侧‘触控…...

网站制作 wordpress/芜湖网络营销公司

科目三考试&#xff1a; 1、报告考官&#xff0c;我是学员***&#xff0c;申请科目三考试。2、进入车内&#xff0c;调整座椅&#xff0c;同时刷身份证。3、下车&#xff0c;关好车门&#xff0c;围车逆时针转一周&#xff0c;注意在车身正前方时稍作停顿&#xff08;车内摄像头…...