本文首发于个人博客https://kezunlin.me/post/1e37a6/,欢迎阅读最新内容!

opencv and numpy matrix multiplication vs element-wise multiplication

Guide

opencv

Matrix multiplication is where two matrices are multiplied directly. This operation multiplies matrix A of size [a x b] with matrix B of size [b x c] to produce matrix C of size [a x c].

In OpenCV it is achieved using the simple * operator:

C = A * B  // Aab * Bbc = Cac

Element-wise multiplication is where each pixel in the output matrix is formed by multiplying that pixel in matrix A by its corresponding entry in matrix B. The input matrices should be the same size, and the output will be the same size as well. This is achieved using the mul() function:

output = A.mul(B); // A B must have same size !!!

code

cv::Mat cv_matmul(const cv::Mat& A, const cv::Mat& B)
{
// matrix multipication m*k, k*n ===> m*n
cv::Mat C = A * B;
return C;
} cv::Mat cv_mul(const cv::Mat& image, const cv::Mat& mask)
{
// element-wise multiplication output[i,j] = image[i,j] * mask[i,j]
cv::Mat output = image.mul(mask, 1.0); // m*n, m*n
return output;
} cv::Mat cv_multiply3x1(const cv::Mat& mat3, const cv::Mat& mat1)
{
std::vector<cv::Mat> channels;
cv::split(mat3, channels); std::vector<cv::Mat> result_channels;
for(int i = 0; i < channels.size(); i++)
{
result_channels.push_back(channels[i].mul(mat1));
} cv::Mat result3;
cv::merge(result_channels, result3);
return result3;
} cv::Mat cv_multiply3x3(const cv::Mat& mat3_a, const cv::Mat& mat3_b)
{
cv::Mat a;
cv::Mat b;
cv::Mat c; std::vector<cv::Mat> a_channels;
std::vector<cv::Mat> b_channels;
std::vector<cv::Mat> c_channels; cv::split(mat3_a, a_channels);
cv::split(mat3_b, b_channels); for(int i = 0; i < a_channels.size() || b_channels.size(); i++)
{
c_channels.push_back(a_channels[i].mul(b_channels[i]));
} cv::merge(c_channels, c);
return c;
}

numpy

numpy arrays are not matrices, and the standard operations *, +, -, / work element-wise on arrays.

Instead, you could try using numpy.matrix, and * will be treated like matrix multiplication.

code

Element-wise multiplication code

>>> img = np.array([1,2,3,4,5,6,7,8]).reshape(2,4)
>>> mask = np.array([1,1,1,1,0,0,0,0]).reshape(2,4)
>>> img * mask
array([[1, 2, 3, 4],
[0, 0, 0, 0]])
>>>
>>> np.multiply(img, mask)
array([[1, 2, 3, 4],
[0, 0, 0, 0]])

for numpy.array, *and multiply work element-wise

matrix multiplication code

>>> a = np.array([1,2,3,4,5,6,7,8]).reshape(2,4)
>>> b = np.array([1,1,1,1,0,0,0,0]).reshape(4,2)
>>> np.matmul(a,b)
array([[ 3, 3],
[11, 11]]) >>> np.dot(a,b)
array([[ 3, 3],
[11, 11]]) >>> a = np.matrix([1,2,3,4,5,6,7,8]).reshape(2,4)
>>> b = np.matrix([1,1,1,1,0,0,0,0]).reshape(4,2)
>>> a
matrix([[1, 2, 3, 4],
[5, 6, 7, 8]])
>>> b
matrix([[1, 1],
[1, 1],
[0, 0],
[0, 0]])
>>> a*b
matrix([[ 3, 3],
[11, 11]]) >>> np.matmul(a,b)
matrix([[ 3, 3],
[11, 11]])

for 2-dim, np.dot equals np.matmul

for numpy.array, np.matmul means matrix multiplication;

for numpy.matrix, * and np.matmul means matrix multiplication;

Reference

History

  • 20190109: created.

Copyright

使用opencv和numpy实现矩阵相乘和按元素相乘 matrix multiplication vs element-wise multiplication的更多相关文章

  1. opencv、numpy中矩阵转置,矩阵内的固定位置相应的坐标变换

    opencv.numpy中矩阵转置,矩阵内的固定位置相应的坐标变换

  2. 用 opencv和numpy进行图片和字符串互转,并保存至 json

    用 opencv和numpy进行图片和字符串互转,并保存至 json 转至 https://zhuanlan.zhihu.com/p/27349847 受 用 base64 进行图片和字符串互转,并保 ...

  3. Python numpy中矩阵的用法总结

    关于Python Numpy库基础知识请参考博文:https://www.cnblogs.com/wj-1314/p/9722794.html Python矩阵的基本用法 mat()函数将目标数据的类 ...

  4. numpy中矩阵乘法,星乘(*)和点乘(.dot)的区别

    import numpy a = numpy.array([[,], [,]]) b = numpy.array([[,], [,]]) 星乘表示矩阵内各对应位置相乘,矩阵a*b下标(0,0)=矩阵a ...

  5. [转]Numpy中矩阵对象(matrix)

    numpy模块中的矩阵对象为numpy.matrix,包括矩阵数据的处理,矩阵的计算,以及基本的统计功能,转置,可逆性等等,包括对复数的处理,均在matrix对象中. class numpy.matr ...

  6. numpy创建矩阵常用方法

    numpy创建矩阵常用方法 arange+reshape in: n = np.arange(0, 30, 2)# start at 0 count up by 2, stop before 30 n ...

  7. 编程计算2×3阶矩阵A和3×2阶矩阵B之积C。 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值。 要求: (1)从键盘分别输入矩阵A和B, 输出乘积矩阵C (2) **输入提示信息为: 输入矩阵A之前提示:"Input 2*3 matrix a:\n" 输入矩阵B之前提示

    编程计算2×3阶矩阵A和3×2阶矩阵B之积C. 矩阵相乘的基本方法是: 矩阵A的第i行的所有元素同矩阵B第j列的元素对应相乘, 并把相乘的结果相加,最终得到的值就是矩阵C的第i行第j列的值. 要求: ...

  8. Numpy中矩阵和数组的区别

    矩阵(Matrix)和数组(Array)的区别主要有以下两点: 矩阵只能为2维的,而数组可以是任意维度的. 矩阵和数组在数学运算上会有不同的结构. 代码展示 1.矩阵的创建 采用mat函数创建矩阵 c ...

  9. numpy的通用函数:快速的元素级数组函数

    通用函数(ufunc)是对ndarray中的数据执行元素级运算的函数.可看作简单函数的矢量化包装. 一元ufunc sqrt对数组中的所有元素开平方 exp对数组中的所有元素求指数 In [93]: ...

随机推荐

  1. RNN循环神经网络

    1.为什么还会有RNN? CNN(卷积神经网络)我们会发现, 他们的输出都是只考虑前一个输入的影响而不考虑其它时刻输入的影响, 比如简单的猫,狗,手写数字等单个物体的识别具有较好的效果. 但是, 对于 ...

  2. 日地拉格朗日L2点轨道的卫星运行

    看了嫦娥四号通信的中继卫星,不明白是怎么运行的,下面的演示解除了我的疑问. https://lt.cjdby.net/thread-2479933-1-2.html

  3. 2020年值得你去试试的10个React开发工具

    本文由葡萄城技术团队翻译并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. JavaScript每天都在出现大量的框架和工具,而React是除了上次我们 ...

  4. django基础之day09,Forms组件在程序中做了哪些事? 校验数据、渲染标签、展示信息

    ******************************* Forms组件 *************************************************** Forms组件在 ...

  5. flink time and watermark

    流处理中时间本质上就是一个普通的递增字段(long型,自1970年算起的微秒数),不一定真的表示时间. watermark只是应对乱序的办法之一,大多是启发式的,在延迟和完整性之间抉择.(如果没有延迟 ...

  6. JAVA Socket API与LINUX Socket API探究

    代码 这是一个带有UI界面的JAVA网络聊天程序,使用Socket连接完成通信. JAVA服务端程序 import java.io.IOException; import java.io.InputS ...

  7. CDN原理加速解析

    CDN概念 CDN全称叫做“Content Delivery Network”,中文叫内容分发网络.   原理分析 我们知道,当我们使用域名访问某一个网站时,实际上就是将请求包(以Http请求为例)通 ...

  8. js如何操作sass里的变量及calc 使用sass变量

    scss文件里 :root { --height-primary: 240px; //--height-primary :变量名,css3有规则 } $header: var(--height-pri ...

  9. angular8 导出excel文件

    angular package 1.xlsx npm install xlsx --save 2.file-saver npm install file-saver --save npm instal ...

  10. 网页解析库-Xpath语法

    网页解析库 简介 除了正则表达式外,还有其他方便快捷的页面解析工具 如:lxml (xpath语法) bs4 pyquery等 Xpath 全称XML Path Language, 即XML路径语言, ...