纯小白记录下腾讯的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的更多相关文章

  1. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  2. 【iScroll源码学习02】分解iScroll三个核心事件点

    前言 最近两天看到很多的总结性发言,我想想今年好像我的变化挺大的,是不是该晚上来水一发呢?嗯,决定了,晚上来水一发! 上周六,我们简单模拟了下iScroll的实现,周日我们开始了学习iScroll的源 ...

  3. Java并发包源码学习之AQS框架(四)AbstractQueuedSynchronizer源码分析

    经过前面几篇文章的铺垫,今天我们终于要看看AQS的庐山真面目了,建议第一次看AbstractQueuedSynchronizer 类源码的朋友可以先看下我前面几篇文章: <Java并发包源码学习 ...

  4. JDK源码学习系列05----LinkedList

                                             JDK源码学习系列05----LinkedList 1.LinkedList简介 LinkedList是基于双向链表实 ...

  5. JDK源码学习系列04----ArrayList

                                                                             JDK源码学习系列04----ArrayList 1. ...

  6. java Integer 源码学习

    转载自http://www.hollischuang.com/archives/1058 Integer 类在对象中包装了一个基本类型 int 的值.Integer 类型的对象包含一个 int 类型的 ...

  7. Dubbo源码学习--集群负载均衡算法的实现

    相关文章: Dubbo源码学习文章目录 前言 Dubbo 的定位是分布式服务框架,为了避免单点压力过大,服务的提供者通常部署多台,如何从服务提供者集群中选取一个进行调用, 就依赖Dubbo的负载均衡策 ...

  8. caffe源码学习之Proto数据格式【1】

    前言: 由于业务需要,接触caffe已经有接近半年,一直忙着阅读各种论文,重现大大小小的模型. 期间也总结过一些caffe源码学习笔记,断断续续,这次打算系统的记录一下caffe源码学习笔记,巩固一下 ...

  9. Redis源码学习:字符串

    Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...

随机推荐

  1. Oracle 存储过程起步

    存储过程的注释不能写在第一行 select后面要有into create or replace procedure DelEmp(v_empno in emp.empno%type) AS No_re ...

  2. GVRP

    一.GARP和GVRP GARP全称是通用属性注册协议(Generic Attribute Registration Protocol),它为处于同一个交换网内的交换成员之间提供了分发.传播.注册某种 ...

  3. centos 7 修改host文件

    centos7与之前的版本都不一样,修改主机名在/ect/hostname 和/ect/hosts 这两个文件控制 首先修改/etc/hostname vi /etc/hostname 打开之后的内容 ...

  4. RHEL7安装配置VNC

    RHEL7安装配置VNC 作者:Eric 微信:loveoracle11g 安装配置VNC服务程序 [root@zhouwanchun yum.repos.d]# cd ~ [root@zhouwan ...

  5. (转)区分LTE,EPS,EPC和SAE

    LTE:Long Term Evolution长期演进,是无线接口部分向4G演进的工作项目. 3GPP:The 3Rd Generation Partnership Project,第三代合作伙伴计划 ...

  6. delphi HTML转义字符编码转换

    网上很多把HTML转换成纯文本格式的方法很多思路都是用正则表达式或者分析html代码替换的方法. 本文是利用IE完成转换,即利用IHTMLDocument2接口. Denon天Denon龙Denon ...

  7. requests模块的cookie和代理操作

    一.基于requests模块的cookie操作 引言:有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时,如果使用之前requests模块常规操作时,往往达不 ...

  8. Java - 33 Java Applet基础

    Java Applet基础 applet是一种Java程序.它一般运行在支持Java的Web浏览器内.因为它有完整的Java API支持,所以applet是一个全功能的Java应用程序. 如下所示是独 ...

  9. GitLab如何创建分支及拉取代码

    从gitlab地址进入进行操作 1.登录GitLab(账号密码由company统一提供,如果是自己操作的话,就需要先注册) 2.登录gitlab后对已创建好的项目进行分支创建(此处默认项目已创建好,如 ...

  10. git push declined due to email privacy restrictions 解决方法

    push declined due to email privacy restrictions 今天push的时候发现了这个问题无法push 解决: 进入github主页==>setting = ...