【考研数据结构代码题8】三元组表示的稀疏矩阵快速转置

news2024/9/23 9:26:21

题目:三元组表示的稀疏矩阵快速转置

考点:矩阵的压缩与存储

难度:★★★

稀疏矩阵压缩存储

三元组结构

//三元组结构 
typedef struct {
    int row;
    int col;
    int value;
} Term;

核心代码

// 转置函数,a为原矩阵,b存放转置后的矩阵 
void transpose(Term a[], Term b[]) {
    int rowTerms[100], startingPos[100];
    int numCols = a[0].col, numRows = a[0].row, numTerms = a[0].value;

    b[0].row = numCols; // 转置后的矩阵行数等于原矩阵的列数
    b[0].col = numRows; // 转置后的矩阵列数等于原矩阵的行数
    b[0].value = numTerms; // 转置后的矩阵非零元素个数等于原矩阵非零元素个数

    if (numTerms > 0) {
        // 统计每一列非零元素的个数
        for (int i = 0; i < numCols; i++)
            rowTerms[i] = 0;
        for (int i = 1; i <= numTerms; i++)
            rowTerms[a[i].col]++;

        // 计算转置后每一列非零元素的起始位置
        startingPos[0] = 1;
        for (int i = 1; i < numCols; i++)
            startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];

        // 执行转置操作(核心) 
        for (int i = 1; i <= numTerms; i++) {
            int j = startingPos[a[i].col]++;
            b[j].row = a[i].col; // 转置后的元素行下标等于原矩阵元素列下标
            b[j].col = a[i].row; // 转置后的元素列下标等于原矩阵元素行下标
            b[j].value = a[i].value; // 转置后的元素值不变
        }
    }
}

完整代码

#include <stdio.h>

#define MAX_TERMS 100
//三元组结构 
typedef struct {
    int row;
    int col;
    int value;
} Term;

// 转置函数,a为原矩阵,b存放转置后的矩阵 
void transpose(Term a[], Term b[]) {
    int rowTerms[100], startingPos[100];
    int numCols = a[0].col, numRows = a[0].row, numTerms = a[0].value;

    b[0].row = numCols; // 转置后的矩阵行数等于原矩阵的列数
    b[0].col = numRows; // 转置后的矩阵列数等于原矩阵的行数
    b[0].value = numTerms; // 转置后的矩阵非零元素个数等于原矩阵非零元素个数

    if (numTerms > 0) {
        // 统计每一列非零元素的个数
        for (int i = 0; i < numCols; i++)
            rowTerms[i] = 0;
        for (int i = 1; i <= numTerms; i++)
            rowTerms[a[i].col]++;

        // 计算转置后每一列非零元素的起始位置
        startingPos[0] = 1;
        for (int i = 1; i < numCols; i++)
            startingPos[i] = startingPos[i - 1] + rowTerms[i - 1];

        // 执行转置操作(核心) 
        for (int i = 1; i <= numTerms; i++) {
            int j = startingPos[a[i].col]++;
            b[j].row = a[i].col; // 转置后的元素行下标等于原矩阵元素列下标
            b[j].col = a[i].row; // 转置后的元素列下标等于原矩阵元素行下标
            b[j].value = a[i].value; // 转置后的元素值不变
        }
    }
}

void printMatrix(Term a[]) {
    int numRows = a[0].row, numCols = a[0].col, numTerms = a[0].value;

    for (int i = 0; i <= numTerms; i++) {
        printf("%3d", a[i].value);
        printf("%3d", a[i].row);
        printf("%3d", a[i].col);
        printf("\n");
    }

    printf("\n");
}

int main() {
    Term a[MAX_TERMS];
    Term b[MAX_TERMS];

    // 初始化原始矩阵
    a[0].row = 6;
    a[0].col = 6;
    a[0].value = 8;

    a[1].row = 0;
    a[1].col = 0;
    a[1].value = 15;
    a[2].row = 0;
    a[2].col = 3;
    a[2].value = 22;
    a[3].row = 0;
    a[3].col = 5;
    a[3].value = -15;
    a[4].row = 1;
    a[4].col = 1;
    a[4].value = 11;
    a[5].row = 1;
    a[5].col = 2;
    a[5].value = 3;
    a[6].row = 2;
    a[6].col = 3;
    a[6].value = -6;
    a[7].row = 4;
    a[7].col = 0;
    a[7].value = 91;

    printf("Original matrix:\n");
    printMatrix(a);

    // 转置矩阵
    transpose(a, b);

    printf("Transposed matrix:\n");
    printMatrix(b);

    return 0;
}

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

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

相关文章

【灌水】自动跑团机器人

实现一个自动COC跑团机器人 这几天玩博德之门3有点累了 #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# 这他妈是什么idea收集器&#xff0c;你们就是靠这个收集idea吗&#xff0c;那我就说一个绝对不赚钱的了。 简单实现了追书人的基本流程&#xff0c;最后…

iview table 默认排序字段不高亮解决办法

iview treeSelect 组件封装 1、表格增加排序时触发的方法2、定义三个变量&#xff0c;sortColumnDefaultStyle存放默认的样式&#xff0c;定义页面默认的列以及顺序3、显示的列加上 sortable, 和样式4、使用下面这块代表默认选中5、点击时清除掉默认的排序6、把排序的字段查询时…

TensorFlow实战教程(十九)-Keras搭建循环神经网络分类案例及RNN原理详解

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章分享了卷积神经网络CNN原理,并通过Keras编写CNN实现了MNIST分类学习案例。这篇文章将详细讲解循环神经网络RNN的原理知识,并采用Keras实现手写数字识别的RNN分类案例及可视化呈现。基础性文…

为什么说品牌低价不是一件好事

消费者货比三价为的是买到低价质优的产品&#xff0c;而网络电商平台的公开&#xff0c;也促进了消费者及品牌进行比价&#xff0c;那品牌低价一定就是好事吗&#xff0c;一定会拉高品牌销量吗。其实是不一定的&#xff0c;低价意味着成本的降低&#xff0c;也可能滋生很多产品…

matlab使用scatter函数画图时报错“数组索引必须为正整数或逻辑值”解决办法

一、背景 在使用matlab的scatter函数画图时报错“数组索引必须为正整数或逻辑值”。 scatter函数说明&#xff1a;scatter(x,y) 在向量 x 和 y 指定的位置创建一个包含圆形标记的散点图。 二、解决办法 如果使用scatter函数时报上述错误&#xff0c;尝试将连续函数先转换为函…

Adobe xd有免费版可以使用吗?

Adobexd现在收费了吗&#xff1f;Adobexd是收费的。Adobexd在中国提供个人版和团队版两项收费政策。个人版每月订阅60元&#xff0c;每年订阅688元&#xff1b;团队版每月订阅112元/用户&#xff0c;每年订阅1288元/用户。 虽然AdobeXD的免费计划已经下线&#xff0c;但Adobe仍…

基于动量的梯度下降

丹尼尔林肯 (Daniel Lincoln)在Unsplash上拍摄的照片 一、说明 基于动量的梯度下降是一种梯度下降优化算法变体&#xff0c;它在更新规则中添加了动量项。动量项计算为过去梯度的移动平均值&#xff0c;过去梯度的权重由称为 Beta 的超参数控制。 这有助于解决与普通梯度下降相…

virtualList 封装使用 虚拟列表 列表优化

虚拟列表 列表优化 virtualList 组件封装 virtualList 组件封装 本虚拟列表 要求一次性加载完所有数据 不适合分页 新建一个select.vue 组件页面 <template><div> <el-select transfer"true" :popper-append-to-body"true"popper-class…

Android修行手册-超出父布局进行显示以及超出父布局实现点击

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

ubuntu下docker环境使用GPU配置

本文主要讲述整个命令流程&#xff0c;具体讲解请看官网nvidia-容器工具包和一篇总结得很详细的博文docker使用GPU总结 docker的版本必须安装19.0版本以上的&#xff0c;这里也只讲19.0版本以上的使用方法 首先设置一下网络信息 curl -fsSL https://nvidia.github.io/libnvi…

批量插入SQL 错误 [933] [42000]: ORA-00933: SQL 命令未正确结束

使用DBeaver向【oracle数据库】插入大量数据 INSERT INTO Student(name,sex,age,address,birthday) VALUES(Nike,男,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike…

Visio学习笔记

1. 常用素材 1.1 立方体&#xff1a;张量, tensor 操作路径&#xff1a;更多形状 ⇒ 常规 ⇒ 基本形状 自动配色 在选择【填充】后Visio会自动进行配色&#xff1b;

我劝烂了,这东西大学生早用早解脱

大学生看我&#xff0c;这个东西太太太香了啊&#xff01;&#xff01;&#xff01; 要写论文&#xff0c;写总结的都给我用起来 这东西能自动写文章&#xff0c;想写几篇就写几篇&#xff0c;篇篇不重复&#xff01;只要输入一个标题&#xff0c;马上就能生成一篇。真的贼香…

2023-11-23 LeetCode每日一题(HTML 实体解析器)

2023-11-23每日一题 一、题目编号 1410. HTML 实体解析器二、题目链接 点击跳转到题目位置 三、题目描述 「HTML 实体解析器」 是一种特殊的解析器&#xff0c;它将 HTML 代码作为输入&#xff0c;并用字符本身替换掉所有这些特殊的字符实体。 HTML 里这些特殊字符和它们…

视频去水印软件有哪些?分享四款好用去水印软件

对于从事自媒体的朋友们来说&#xff0c;保护自己的视频作品免受盗用至关重要。为了标识归属&#xff0c;我们通常会在视频上添加水印。然而&#xff0c;当我们在寻找素材并打算进行剪辑时&#xff0c;发现素材上的水印会严重干扰使用。在这种情况下&#xff0c;我们需要采取一…

【Linux】who命令使用

who who命令用于显示系统中有哪些使用者正在上面&#xff0c;显示的资料包含了使用者 ID、使用的终端机、从哪边连上来的、上线时间、呆滞时间、CPU 使用量、动作等等。 著者 由Joseph Arceneaux、David MacKenzie和Michael Stone撰写。 语法 who [选项] [文件|参数] who命…

第19章JAVA绘图

19.1JAVA绘图类 绘图是高级程序设计中非常重要的技术 19.1.1Graphics类 Graphics类是所有图形上下文的抽象基类&#xff0c;它允许应用程序在组件以及闭屏图片上进行绘制 Graphics类封装了JAVA支持的基本绘图操作所需的状态信息&#xff0c;主要包括颜色&#xff0c;字体&…

Doris-集群部署(四)

创建目录并拷贝编译后的文件 1&#xff09;创建目录并拷贝编译后的文件 mkdir /opt/module/apache-doris-0.15.0 cp -r /opt/software/apache-doris-0.15.0-incubating-src/output /opt/module/apache-doris-0.15.02&#xff09;修改可打开文件数&#xff08;每个节点&#x…

jenkins 参数构建

应用保存 [rootjenkins-node1 .ssh]# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved i…