ncnn 源码学习-Mat.h Mat.c
纯小白记录下腾讯的ncnn框架源码的学习。纯粹写给自己看的,不保证正确性。
Mat 类似于 caffe中的blob,是一个张量的存储结构体。
一、数据成员:
1、void * data 多维数据按一位数组来存储。并且需要是16字节对齐的。
2、int * refcount *refcount表示这个Mat被引用的个数。类似于智能指针?×refcount == 0 自动释放。
3、size_t elemsize 每个元素的大小。sizeof(type)
4、dims 维度。如果是1维就是向量只有w,2维就是平面w * h, 3维就是立方体 w * h * c。
5、w h c三个维度
6、cstep : channel step 每个channel 有多少个元素。注意是元素个数,而不是字节数。
total() = cstep * c 整个Mat有多少个元素。
二、方法成员:
void create(int _w, size_t _elemsize);
一维数组初始化。只有一个w。二维平面就是w h。
三维有些特殊:
cstep 不是单纯的 w * h, 而是要求每个channel的起始地址都是16字节对齐的。
cstep 是 w*h*elemsize在16的基础上,对齐得到的。
也就是说,cstep * elemsize 必须是16的倍数。
所以,三维mat的大小不是简单的elemsize* align(w * h * c,16)。而是elemsize* c* align(w*h, 16).
Mat Mat::channel(int c)
返回某一个channel的一维新Mat。
在channel内部,数据是连续的。channel之间可能有空隙。为了保证每个channel的起始地址是16对齐。
float * Mat::row(int y)
返回某一个Mat的第一个channel的第y个行的首地址。
template <typename T>
inline Mat::operator T*()
{
return (T*)data;
}
这个符号重载,神奇。把Mat转换成任意T *类型的指针。
返回的其内存地址。
inline float& Mat::operator[](int i)
{
return ((float*)data)[i];
}
重载了取下标操作,直接取其地址的第i个。
因为channel之间不是连续的,所以这么取对第1个以后的channel来说,可能会出问题。应该是对dim < 3的方法。
ncnn 源码学习-Mat.h Mat.c的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- 【iScroll源码学习02】分解iScroll三个核心事件点
前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...
- Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析
经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...
- JDK源码学习系列05----LinkedList
JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...
- JDK源码学习系列04----ArrayList
JDK源码学习系列04----ArrayList 1. ...
- java Integer 源码学习
转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...
- Dubbo源码学习--集群负载均衡算法的实现
相关文章: Dubbo源码学习文章目录 前言 Dubbo 的定位是分布式服务框架,为了避免单点压力过大,服务的提供者通常部署多台,如何从服务提供者集群中选取一个进行调用, 就依赖Dubbo的负载均衡策 ...
- caffe源码学习之Proto数据格式【1】
前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下 ...
- Redis源码学习:字符串
Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...
随机推荐
- 如何修改CSV文件的分隔符
Excel转成CSV文件,在Windows下默认的列表分隔符是逗号(,).在某些情况下,我们可能需要更改列表分隔符,如某个单元格内容包含逗号,而这可能导致使用它的程序出错,这样就需要更改列表分隔符:再 ...
- Scrapy学习篇(三)之创建项目和Scrapy的安装
安装Scrapy 了解了Scrapy的框架和部分命令行之后,创建项目,开始使用之前,当然是安装Scrapy框架了. 关于Scrapy框架的安装,请参考:https://cuiqingcai.com/5 ...
- [UE4]不推荐的UI更新方式
在创建UI的时候,把UI保存到一个变量,直接访问其中的控件. 这种方法会增加耦合,不推荐,应当尽量避免使用这种方式.
- linux系统配置jdk环境
前提:linux服务器+JDK8-linux版本 工具:FileZilla+Xshell 将jdk上传到服务器的某个文件夹(本人是JDK) 进入该文件夹,输入tar xzvf jdk-8u77-li ...
- make install 时指定安装路径
The make install target dir is representationed by var : DESTDIR, if we set this var to the locati ...
- Markdown画各种图表
并不是所有编辑器都支持,比如博客园这个就不支持... 流程图 st=>start: 开始 op=>operation: 首先按个按钮 op2=>operation: 那你从头开始吧 ...
- Java - 25 Java 包(package)
Java 包(package) 为了更好地组织类,Java提供了包机制,用于区别类名的命名空间. 包的作用 1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用. 2 如同文件夹一样,包 ...
- python利用socket写一个文件上传
1.先将一张图片拖入‘文件上传’的目录下,利用socket把这张图片写到叫‘yuan’的文件中 2.代码: #模拟服务端 import subprocess import os import sock ...
- python 中logging模块
logging的作用:python中,logging模块主要是处理日志的.所谓日志,可理解为在软件运行过程中,所记录的的一些运行情况信息,软件开发人员可以根据自己的需求添加日志,日志可以帮助软件开发人 ...
- day2作业(基本数据类型,语法)
#coding:utf-8 '''1.写代码实现用户输入用户名和密码,当用户名为 seven 且 密码为 123 时,显示登陆成功,否则登陆失败!实现用户输入用户名和密码,当用户名为 seven 且 ...