一个函数最好只做一件事?未必!这是一个例子

  编程实践中,为了模块化设计,降低程序的复杂度,提高程序的可读性,通常设计一个函数时应尽可能简单,简单到只做一件事。然而,工程实践中,有时候受制于一些因素,如内存空间、程序执行效率等,迫使我们不得不打破“一个函数只做一件事”的规则。下面是一个例子:
  在嵌入式系统中,假设有一个100000行50列的矩阵A,需要计算矩阵A的转置乘以矩阵A。如果按照“一个函数只做一件事”的规则,那么我们需要编写计算矩阵转置的函数和矩阵相乘的函数,为了计算矩阵A的转置乘以矩阵A,调用函数计算矩阵的转置时,我们不得不额外定义一个占用内存空间很大的50行100000列的矩阵,这对于内存空间紧张的嵌入式系统,是一大问题。如果我们打破“一个函数只做一件事”的规则,定义一个函数同时计算矩阵的转置和矩阵相乘,这时不再需要额外定义一个很大的矩阵,不仅减少一次函数调用的开销,提高了程序执行效率,而且设计一个同时计算矩阵的转置和矩阵相乘的函数,函数依然简洁易读。事无绝对,切记勿墨守陈规!
  下面是示例代码:

#include <stdio.h>
//C = A' * B
void matrixTransposeAndMultiply(double *A, int rowsA, int colsA, double *B, int rowsB, int colsB, double *C)
{int i, j, k;// 计算转置乘以矩阵B的结果for (i = 0; i < colsA; i++){for (j = 0; j < colsB; j++){C[i * colsB + j] = 0;for (k = 0; k < rowsA; k++){C[i * colsB + j] += A[k * colsA + i] * B[k * colsB + j];}}}// 打印结果for ( i = 0; i < colsA; i++){for (j = 0; j < colsB; j++) {printf("%f\t", C[i * colsB + j]);}printf("\n");}printf("\n");}void main(void)
{double A[2 * 3] = { 1,2,5,4,7,2 }, B[2 * 1] = {4,5}, C[3 * 3], D[3 * 1];//C = A' * AmatrixTransposeAndMultiply(A, 2, 3, A, 2, 3, C);//D = A' * BmatrixTransposeAndMultiply(A, 2, 3, B, 2, 1, D);
}

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

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

相关文章

大数据Doris(二十九):数据导入(Insert Into)

文章目录 数据导入(Insert Into) 一、​​​​​​​创建导入

算法通关村第五关—Hash基础知识(青铜)

Hash基础 一、Hash的概念和基本特征 哈希(Hash)也称为散列&#xff0c;就是把任意长度的输入&#xff0c;通过散列算法&#xff0c;变换成固定长度的输出&#xff0c;这个输出值就是散列值。很多人可能想不明白&#xff0c;这里的映射到底是啥意思&#xff0c;为啥访问的时间…

MetricBeat安装使用

目录 一、环境准备 二、安装部署 2.1 下载安装包到指定文件夹&#xff0c;并解压 2.2 复制证书文件 2.3 编辑配置文件 2.3 监控系统使用情况 2.3 启动服务 2.3 查看监控信息 一、环境准备 部署模式&#xff1a;单节点部署。监控的服务在哪个机器上则在哪个机器上部署 安…

基于SpringBoot的旅游网站的设计与实现

摘 要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游网站方式&#xff0c;不仅使旅游管理…

支持中文,性能超GPT-4!为开发人员而生的 AI 搜索引擎

生成式AI代码开发平台Phind在官网发布了最新V7版本&#xff0c;性能方面超越GPT-4&#xff0c;运行效率提升了5倍&#xff0c;并且支持中文和16K超长上下文。 据悉&#xff0c;Phind V7是基于Phind的开源代码模型CodeLlama-34B V2&#xff0c;以及700亿个高质量代码和推理问题…

对话框、内部控件位置

一、了解下几个函数 1、movewindow 了解下&#xff1a;MoveWindow 自己塞进去的是屏幕坐标 CrvtFaultRodDlg* dlg new CrvtFaultRodDlg();if (dlg ! NULL){BOOL ret dlg->Create(IDD_DlgCrvtFaultRod, NULL);if (ret) //Create failed.{RECT rect;{RECT rect1;dlg->…

企业数字化转型应对传统网络挑战的关键策略

数字化变革正在以前所未有的速度和规模改变着我们的生活和工作方式&#xff0c;使得传统网络架构面临着巨大的挑战。其中包括带宽需求增加、多云应用增加、安全威胁增加以及传统网络设备无法满足需求等问题。 数字化时代需要更高速、更可靠、更安全的网络支持&#xff0c;传统网…

词嵌入Word Embedding

1. 背景 词嵌入定义为NLP中语言建模和特征学习技术的总称&#xff0c;是一种将文本中的词汇转化成数值向量的方法(将字典中的单词和词组映射成实向量)。 one-hot编码存在的一个主要问题是它无法表示出词汇间的相似度。 2. 分布式表示 分布式表示试图通过考虑上下文词…

西安数字孪生赋能工业制造,加速推进制造业数字化转型

西安数字孪生、5G、工业物联网、工业互联网等新一代信息通信技术与工业制造业经济深度融合&#xff0c;通过对人、机、物、系统等全面连接&#xff0c;构建覆盖全产业链、全价值链的全新制造和服务体系&#xff0c;为工业乃至产业数字化、网络化、智能化发展提供实现途径&#…

Redis String类型

String 类型是 Redis 最基本的数据类型&#xff0c;String 类型在 Redis 内部使用动态长度数组实现&#xff0c;Redis 在存储数据时会根据数据的大小动态地调整数组的长度。Redis 中字符串类型的值最大可以达到 512 MB。 关于字符串需要特别注意∶ 首先&#xff0c;Redis 中所…

Python 3 获取配置文件中的值

1 配置文件内容 config.ini # 登录信息 [login] url https://www.baidu.com username wangxiaoli userpass admin123# 天气信息 [weather] # 是否下雨 rain True # 降雨量 rainvalue 5.05 # 是否下雪 snow False # 降雪量 snowvalue 8.32# SQLServer [sqlserver] user …

改进YOLO5:结合CVPR2023最新 PConv |包含 YOLOv5 / YOLOv8 模型 YAML 文件

改进YOLO5:结合CVPR2023最新 PConv |包含 YOLOv5 / YOLOv8 模型 YAML 文件 一、论文总结PConv模块优势二、YOLOv51. yaml文件2. common代码文件三、YOLOv81. yaml2. modules文件添加3. Task文件4. 测试论文链接🎁 :https://arxiv.org/pdf/2303.0366

低代码平台在数字化转型过程中的定位

内容来自演讲&#xff1a;郭昊东 | 上海外服 | 流程分析工程师 摘要 本文介绍了外服集团的 IT 共享中心在低代码平台应用开发方面的实践经验。他们选择低代码平台的原因包括开发成本低、快速看到实际产品以及能够解决数据孤岛和影子 IT 等问题。他们在应用开发中面临的挑战包括…

基于Java SSM框架+Vue实现汉服文化平台网站项目【项目源码+论文说明】

基于java的SSM框架Vue实现汉服文化平台系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个汉服文化平台网站 &#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作者将…

线上问题排查总结

目录 线上问题排查总结 &#xff08;1&#xff09;排查服务器 &#xff08;2&#xff09;排查数据库 &#xff08;3&#xff09;排查慢sql &#xff08;4&#xff09;排查网速 &#xff08;5&#xff09;增加日志打印 &#xff08;6&#xff09;如果现场数据库很慢&#xf…

【RabbitMQ】RabbitMQ快速入门 通俗易懂 初学者入门

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Que…

2023.11.29 -hmzx电商平台建设项目 -核销主题阶段总结

目录 1.准备源数据 2.准备数仓工具进行源数据同步到ods层,本项目使用Datax 3.使用Datax完成数据同步前建表时的方案选择 3.1同步方式区别: 3.2存储格式和压缩区别: 4.在hive中创建表,共31个表 5.数仓概念 和 数仓建模方案 5.1数仓的基本概念 5.2 数仓建模方案 关系建模…

信贷销售经理简历模板

这份简历内容&#xff0c;以信贷销售经理招聘需求为背景&#xff0c;我们制作了1份全面、专业且具有参考价值的简历案例&#xff0c;大家可以灵活借鉴。 信贷销售经理简历模板在线编辑下载&#xff1a;百度幻主简历 求职意向 求职类型&#xff1a;全职 意向岗位&#xff…

光伏设计软件:创新工具,提升设计效率与质量

随着可再生能源的全球关注度不断提高&#xff0c;光伏产业也迎来了前所未有的发展机遇。光伏设计软件作为支持光伏项目的重要工具&#xff0c;为设计师提供了强大的功能&#xff0c;以优化设计过程&#xff0c;提高设计效率&#xff0c;减少错误&#xff0c;降低成本。 首先&am…

保存规则、nat、自定义链

目录 一、保存防火墙的规则 1、保存规则 二、nat 一、SNAT和DNAT 1.SNAT 2 DNAT 三、自定义链 1.添加自定义链 2.设置自定义链并生效 3.删除自定义链 一、保存防火墙的规则 1、保存规则 [rootlocalhost ~]# iptables -A INPUT -s 172.16.114.30 -p tcp -m multiport…