Mat矩阵如何获取元素

2024-06-14 12:58
文章标签 元素 获取 矩阵 mat

本文主要是介绍Mat矩阵如何获取元素,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【前排注释】:来源于openCV官方文档http://docs.opencv.org/2.4/modules/core/doc/basic_structures.html#mat

问题:对矩阵内所有的正数求和,需要遍历每个元素,累加。

想法一:

遍历,累加

double sum = 0; 
for (int i = 0; i < M.rows; i++) {
const double* Mi = M.ptr(i);
for(int j = 0; j< M.cols; j++) {
sum += std::max(Mi[j], 0);
}
}

想法二:

  想法一比较暴力,没有很好的变通性。在累加之前我们可以先判断一下整个矩阵是不是连续的。如果是连续的,那么就可以把整个矩阵看成是一个很长的一维数组。【连续就是元素的内存地址是否连续,内存很大时一般时连续的,连续的存储有利于快速扫描】

double sum = 0; 
int cols = M.cols;
int rows = M.rows;
if (M.isContinuous()) {
cols = cols rows;
rows = 1;
}
for (int i = 0; i < rows; i++) {
const double *Mi = M.ptr(i);
for (int j = 0; j< cols; j++) {
sum += std::max(Mi[j], 0);
}
}

这个方法在于提前判断了M矩阵是否连续,如果连续,那么求和过程中的外层for循环只需要一次,大大降低了开销。

isContinuous()函数解释:
  该函数返回被检测矩阵每一行的最后面是不是连续的。通常来说,1*N的矩阵都是连续的,create()函数创建的矩阵是连续的。但是如果是在矩阵中提取一部分元素作为新矩阵,如函数col(),diag()等, 还有就是为已分配数据部分内存的空间申请头部信息,也可能不会连续。
  该函数检测矩阵是不是连续并不是通过遍历矩阵的方式,而是检测矩阵头部信息的标志位,这个标志位是在你创建矩阵头部信息的时候就计算出来的,因此判断矩阵是否连续是一个十分快速的操作。

想法三:

STL模板迭代器可以智能的避开每一行结尾不连续的部分。

double sum = 0; 
MatConstIterator_ it = M.begin(), it_end = M.end();
for (; it != it_end; ++it) {
sum += std::max(*it, 0);
}

Mat矩阵的迭代器可以应用在任何STL算法中,包括排序算法 std::sort()

这篇关于Mat矩阵如何获取元素的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1060473

相关文章

使用Python实现获取网页指定内容

《使用Python实现获取网页指定内容》在当今互联网时代,网页数据抓取是一项非常重要的技能,本文将带你从零开始学习如何使用Python获取网页中的指定内容,希望对大家有所帮助... 目录引言1. 网页抓取的基本概念2. python中的网页抓取库3. 安装必要的库4. 发送HTTP请求并获取网页内容5. 解

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何获取域名的SSL证书信息和到期时间

《Python如何获取域名的SSL证书信息和到期时间》在当今互联网时代,SSL证书的重要性不言而喻,它不仅为用户提供了安全的连接,还能提高网站的搜索引擎排名,那我们怎么才能通过Python获取域名的S... 目录了解SSL证书的基本概念使用python库来抓取SSL证书信息安装必要的库编写获取SSL证书信息

Win32下C++实现快速获取硬盘分区信息

《Win32下C++实现快速获取硬盘分区信息》这篇文章主要为大家详细介绍了Win32下C++如何实现快速获取硬盘分区信息,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 实现代码CDiskDriveUtils.h#pragma once #include <wtypesbase

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

golang获取prometheus数据(prometheus/client_golang包)

《golang获取prometheus数据(prometheus/client_golang包)》本文主要介绍了使用Go语言的prometheus/client_golang包来获取Prometheu... 目录1. 创建链接1.1 语法1.2 完整示例2. 简单查询2.1 语法2.2 完整示例3. 范围值

javaScript在表单提交时获取表单数据的示例代码

《javaScript在表单提交时获取表单数据的示例代码》本文介绍了五种在JavaScript中获取表单数据的方法:使用FormData对象、手动提取表单数据、使用querySelector获取单个字... 方法 1:使用 FormData 对象FormData 是一个方便的内置对象,用于获取表单中的键值