opencv计算矩阵与数值的乘积,矩阵与矩阵的乘积

1、矩阵与数值的乘积

在进行数组与一个常量相乘的运算时,使用了Mat类中的mul函数。

//! per-element matrix multiplication by means of matrix expressions
MatExpr mul(InputArray m, double scale=1) const;

使用后,发现数据有些异常,于是就打印出每一个计算后的数值,

发现原来该函数是将,m中矩阵每个元素先做二次方运算,再与scale相乘,于是放弃用该函数,改用

//! computes element-wise weighted product of the two arrays (dst = scale*src1*src2)
CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,
                           OutputArray dst, double scale=1, int dtype=-1);

在使用时,先设置

Mat src2 = Mat::ones(src1.rows, src1.cols, src1.type()); 

然后再进行src1与scale的相乘运算:

multiply(src1, src2, IResult, scale);

2、矩阵与矩阵的乘积

C(m*k) = A(m*n) * B(n*k)

计算上述运算时,就不能用

<pre name="code" class="cpp">multiply(src1, src2, IResult, scale);

这个函数来计算了,因为这个函数只适用于计算两个大小相同的矩阵的对应点的乘积。

所以采用gemm()函数来计算:

//! implements generalized matrix product algorithm GEMM from BLAS
CV_EXPORTS_W void gemm(InputArray src1, InputArray src2, double alpha,
                       InputArray src3, double gamma, OutputArray dst, int flags=0);

使用时注意flags的含义:默认是0,表示输入的矩阵都不转置。

dst = alpha* src1 *src2 + gamma* src3

如果要对某个输入的矩阵进行转置,可进行如下设置:

flags –

operation flags:

GEMM_1_T transposes src1.

GEMM_2_T transposes src2.

GEMM_3_T transposes src3.

opencv计算矩阵与数值的乘积,矩阵与矩阵的乘积

时间: 2024-11-13 15:24:11

opencv计算矩阵与数值的乘积,矩阵与矩阵的乘积的相关文章

矩阵快速幂——将运算推广到矩阵上HDU 1575

/* 本题的思路比较简单,就是将递推公式写出来,然后表达成为一个矩阵的形式 最后通过计算就可以得到一个符合题目要求的矩阵, 然后就是将矩阵上面所有的对角线元素相加 得到的结果即为所求的目标 */ #include<cstdio>  #include<cstring>  using namespace std;  const int maxn = 15;  #define mod 9973  int res[maxn][maxn];  int n;  void mul(int a[]

空间权重矩阵的那些事(八)-球面距离权重矩阵

前段时间有人向我咨询了根据经纬度计算球面距离的方法,希望我出一篇文章,所以就有了这篇文章.必要文件可通过后台回复「地理经纬度」获取. 我首先想到的是matlab的「jplv7」工具箱里的「distance」函数,下面是具体的程序内容: function D = distance(xc,yc) % PURPOSE: Computes the list of pairwise distances for a given set of locations (loc). % --------------

计算int 型数值在内存中二进制1的个数

今天在华为OJ上遇到这么一个题目,很简单,但是却总是得不到最好的成绩记录.因此比较了自己的程序.思路与别人的异同,发现还是有很大区别的,遂记录如下. 题目-- 输入一个int型整数,求该整数的二进制在内存中有多少个1.例如输入10,由于其二进制表示为1010,有两个1,因此输出2. 思路1 <span style="font-size:18px;">public static void main(String[] args) { Scanner scanner = new

c语言判断两个矩阵是否相等(行列相同的矩阵)

#include<stdio.h>void input(int n, int m, int a[20][20])//输入矩阵元素{int i, j;for (i = 0; i < n; i++){for (j = 0; j < m; j++){scanf("%d", &a[i][j]);}}}void in(int n, int m, int b[20][20])//输入另一个矩阵元素{int i, j;for (i = 0; i < n; i++

程序员代码面试指南: 数学计算 在行列都排好序的矩阵中找指定的数

#include<bits/stdc++.h> using namespace std; int main() { int n,m,k; cin >> n >> m >> k; int a[n][m]; for(int i = 0;i < n;++i) for(int j = 0;j < m; ++j) { cin >> a[i][j]; } int x ; int col = m - 1; int row = 0; while(ro

不使用额外空间复杂度(缓存矩阵)顺时针旋转一个N*N的矩阵

import java.util.*; public class Transform { public int[][] transformImage(int[][] mat, int n) { // write code here for(int i=0;i<n/2;i++){ for(int j=i;j<n-1-i;j++){ int temp=mat[i][j]; mat[i][j]=mat[n-1-j][i]; mat[n-1-j][i]=mat[n-1-i][n-1-j]; mat[n

矩阵及其运算(一):创建一个矩阵类

在VB.NET中可以通过一个数组(Array)来简单表示矩阵,为实现更多功能也可以用类(Class)来表示. 矩阵的数学定义:由m*n个数排成的m行n列的数表 Public Class Matrix Private TableData(,) As Double Private RowLength, ColLength As Integer '矩阵的行长度 Public ReadOnly Property Row() Get Return RowLength End Get End Propert

opencv计算两个轮廓之间hu矩相似程度,MatchShapes

https://blog.csdn.net/jiake_yang/article/details/52589063 [OpenCV3.3]通过透视变换矫正变形图像 https://blog.csdn.net/rrrfff/article/details/77340641 OPENCV提供了输入图像直接进行hu矩匹配的函数,返回的是两个图像或轮廓之间hu矩的相似度: double cvMatchShapes(const void*object1,const void*object2,int met

python之使用heapq()函数计算列表中数值大小

# heapq函数:计算列表最大几个值和最小几个值 # 语法:heapq.nlargest(n, list,[key]) # n表示最大或最小的几个: list为分析的对象: key为排序关键字,非必填 import heapq list_num = [1, 4, 3, 2, 5] print("最大的一个:", max(list_num)) # 求列表最大的两个 list_temp = heapq.nlargest(2, list_num) print("最大的两个:&qu