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函数。

 在下列代码中使用了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;  
}

4 运行结果

首先,我们初始化了几个向量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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/846884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

csrf漏洞与ssrf漏洞

环境&#xff1a;用kali搭建的pikachu靶场 一.CSRF 1.CSRF漏洞简介 跨站请求伪造&#xff08;CSRF&#xff09;漏洞是一种Web应用程序安全漏洞&#xff0c;攻击者通过伪装成受信任用户的请求来执行未经授权的操作。这可能导致用户在不知情的情况下执行某些敏感操作&#xff0…

遥感之特征选择-禁忌搜索算法

各类智能优化算法其主要区别在于算法的运行规则不同&#xff0c;比如常用的遗传算法&#xff0c;其规则就是变异&#xff0c;交叉和选择等&#xff0c;各种不同的变体大多是在框架内的实现细节不同&#xff0c;而本文中的禁忌算法也是如此&#xff0c;其算法框架如下进行介绍。…

丰盘v24.5集成OnlyOffice 7.5版本,支持子管理员高级特性

五一劳动节刚过&#xff0c;我们的开发小伙伴上线发布了v24.5版本&#xff0c;支持原生集成OnlyOffice 7.5的套件版本&#xff0c;无需管理员手工配置密钥证书等繁琐操作&#xff0c;对Word、PPT和Excel文件有了更强的兼容性和稳定性&#xff0c;例如当文件里包含Visio图像时&a…

C之动态内存管理(动态内存开辟与调整等)

目录 1.为什么要有动态内存分配 2.malloc、calloc、realloc和free malloc&#xff1a; calloc&#xff1a; realloc&#xff1a; free&#xff1a; 3.常见的动态内存的错误 3.1&#xff1a;对NULL指针的解引用操作 3.2&#xff1a;对动态开辟空间的越界访问 3.3&…

长城电脑如何恢复删除文件?盘点几个实用方法

咨询&#xff1a;急求帮助&#xff01;我不慎在长城电脑上删除了文件&#xff0c;还有机会恢复吗&#xff1f;一个疏忽&#xff0c;就把一份至关重要的工作文件给删掉了&#xff01;请大家快快伸出援手&#xff0c;帮我找回这份文件吧&#xff01; 在使用长城电脑的过程中&…

Linux_应用篇(11) 线程

上一章&#xff0c;学习了进程相关的知识内容&#xff0c; 对进程有了一个比较全面的认识和理解&#xff1b; 本章开始&#xff0c; 将学习 Linux应用编程中非常重要的编程技巧---线程&#xff08;Thread&#xff09; &#xff1b;与进程类似&#xff0c;线程是允许应用程序并发…

GaussDB数据库如何创建修改数据库和数据表

目录 一、背景 二、创建数据库和数据表 1. 创建数据库 2.创建数据表 三、修改表结构 1. 添加列 2. 修改列 3. 删除列 四、添加约束 1. 添加主键约束 2. 添加外键约束 3.添加唯一性约束 五、示例代码 -- 创建数据库 -- 使用新创建的数据库 -- 创建 department 表…

发送Http请求的两种方式

说明&#xff1a;在项目中&#xff0c;我们有时会需要调用第三方接口&#xff0c;获取调用结果&#xff0c;来实现自己的业务逻辑。调用第三方接口&#xff0c;通常是双方确定好&#xff0c;由对方开放一个接口&#xff0c;需要我们根据他们提供的接口文档&#xff0c;组装Http…

MySQL 使用方法以及教程

一、引言 MySQL是一个流行的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;广泛应用于Web开发、数据分析等领域。它提供了高效、稳定的数据存储和查询功能。同时&#xff0c;Python作为一种强大的编程语言&#xff0c;也提供了多种与MySQL交互的库&#…

Ubuntu 24.04 LTS 安装Docker

1 更新软件包索引&#xff1a; sudo apt-get update 2 安装必要的软件包&#xff0c;以允许apt通过HTTPS使用仓库&#xff1a; sudo apt-get install apt-transport-https ca-certificates curl software-properties-common 3 添加Docker的官方GPG密钥&#xff1a; curl -fs…

算法金 | 你真的完全理解 Logistic 回归算法了吗

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 今日 178/10000 1. 引言 吴恩达&#xff1a;机器学习的六个核心算法&#xff01;&#xff0c; 通透&#xff01;&#xff01;十大回…

Python专为开发和部署数据驱动的应用程序库之taipy使用详解

概要 Taipy 是一个强大的 Python 库,专为开发和部署数据驱动的应用程序而设计。它通过提供一套丰富的工具和组件,使开发者能够快速构建和维护复杂的业务逻辑和数据交互界面。无论是金融分析、供应链管理还是任何需要高度数据交互的应用,taipy 都能提供高效的解决方案。 安装…

Orange AIpro开箱上手

0.介绍 首先感谢官方给到机会&#xff0c;有幸参加这次活动。 OrangePi AIpro(8T)采用昇腾AI技术路线&#xff0c;具体为4核64位处理器AI处理器&#xff0c;集成图形处理器&#xff0c;支持8TOPS AI算力&#xff0c;拥有8GB/16GB LPDDR4X&#xff0c;可以外接32GB/64GB/128GB/2…

小程序抓包详细教程

小程序抓包详细教程 前言&#xff1a;关于小程序抓包一直想写出一个比较详细的教程 实验设备&#xff1a; ​ 微信: https://windows.weixin.qq.com/?langzh_CN ​ Proxifier&#xff1a;https://www.proxifier.com/download/ (需要挂梯子访问下载) ​ burpsuite&#xff…

1.JAVA小项目(零钱通)

一、说明 博客内容&#xff1a;B站韩顺平老师的视频&#xff0c;以及代码的整理。此项目分为两个版本&#xff1a; 面向过程思路实现面向对象思路实现 韩老师视频地址&#xff1a;【【零基础 快速学Java】韩顺平 零基础30天学会Java】 https://www.bilibili.com/video/BV1fh4…

Spring 源码:深度解析AOP源码配置解析

文章目录 一、 解析AOP配置的入口1.1 从XML配置到AOP Namespace的解析流程1.2 分析注解驱动的AOP配置解析流程 二、AOP配置解析的核心流程2.1 ConfigBeanDefinitionParser 类2.2 parse()2.3 parseAdvisor()2.4 parseAspect()2.5 parsePointcut()2.6 createAdvisorBeanDefinitio…

算法每日一题(python,2024.05.29) day.11

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 法一&#xff1a;切片函数法 直接用python中的切片函数直接解决 法二&#xff1a;交换法 从俩头开始交换字符串的数字&#xff0c;若为奇数&#xff…

GITLAB常见问题总结

Troubleshooting GitLab Pages administration (FREE SELF) 原文地址 stage: Plan group: Knowledge info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/product/ux/technical-writing/…

STM8单片机变频器设计

变频调速技术是现代电力传动技术的重要发展方向,而作为变频调速系统的核心—变频器的性能也越来越成为调速性能优劣的决定因素,除了变频器本身制造工艺的“先天”条件外,对变频器采用什么样的控制方式也是非常重要的。随着电力电子技术、微电子技术、计算机网络等高新技术的…

Kompas AI:智能生活的开启者

引言 在现代社会&#xff0c;**人工智能&#xff08;AI&#xff09;**已经深刻地影响了我们的生活和工作。无论是智能家居、自动驾驶&#xff0c;还是医疗诊断&#xff0c;AI的应用无处不在。而在众多AI平台中&#xff0c;Kompas AI 作为一个先进的对话式AI平台&#xff0c;通过…