纯小白记录下腾讯的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. centos6.8下pptp客户端的安装配置

    原文: https://blog.csdn.net/zhang11321132/article/details/20612473 yum -y install ppp pptp pptp-setup ...

  2. QoS 服务质量

    一.QoS QoS: Quality of Service(服务质量) 是指网络通信过程中,允许用户业务在丢包率.延迟.抖动和带宽等方面获得可预期的服务水平.更简单地说:QoS就是针对各种不同需求,提 ...

  3. [UE4]GameplayAbilities,技能系统插件

    Unreal Engine 4(虚幻UE4)GameplayAbilities 插件入门教程(七)Ability的信息传递等   Unreal Engine 4(虚幻UE4)GameplayAbili ...

  4. [UE4]条件语句Select

    select接收3个参数,输出一个值. 当条件为true时,返回输入到True节点的值. 当条件为false时,返回输入到false节点的值. select的输入和输出参数也可以是整数.float.V ...

  5. 00001 - Linux下 环境变量/etc/profile、/etc/bashrc、~/.bashrc的区别

    ①/etc/profile: 该文件登录操作系统时,为每个用户设置环境信息,当用户第一次登录时,该文件被执行.也就是说这个文件对每个shell都有效,用于获取系统的环境信息. # /etc/profi ...

  6. postgresql定位分析消耗CPU高的SQL语句

    第一步:使用TOP命令查看占用CPU高的postgresql进程,并获取该进程的ID号,如图该id号为3640 第二步:切换到postgres用户,并且psql连接到数据库,执行如下查询语句 SELE ...

  7. cocos源码分析--RenderTexture

    cocos中RenderTexture主要用来实现截屏,然后把截取出来的图片保存到磁盘中,除了保存图片和渲染纹理,它还可以得到一些预渲染结果,并将这些结果作为一种纹理数据. 例如我们可以用RGB5_A ...

  8. requests模块学习

    - 基于如下5点展开requests模块的学习 什么是requests模块 requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求.功能强大,用法简洁高效.在 ...

  9. python随机数random

    1.random.random()方法用于生成一个0到1的随机浮点数:0<=n<1.0 2.random.uniform(a,b):用于生成一个指定范围内的随机浮点数,两格参数中,其中一个 ...

  10. linux运行.sh命令

    # chmod +x AAA.sh  授权 # ./AAA.sh                  运行