写代码时候需要用到kron这个函数,matlab中有,但搜了一圈竟然OpenCV没有,而且复现的很一般,因此,我尽可能用最标准的方法,也就是兼容各种数据格式,实现了这个函数,复现之后,在我的研究中测试,无误。

下面就放上这个函数的声明,m1,m2为输入的二维矩阵, mkron为输出的对应矩阵。

void kron(cv::InputArray m1, cv::InputArray m2, cv::OutputArray mkron);

在matlab中的实例

m1 = [1,2,3;2,3,4];
m2 = [2,3,4;3,4,5];
mkron = kron(m1,m2);%% 输出:
mkron =2     3     4     4     6     8     6     9    123     4     5     6     8    10     9    12    154     6     8     6     9    12     8    12    166     8    10     9    12    15    12    16    20

在C++中用法:

int m1[] = { 1,2,3,2,3,4 };
int m2[] = { 2,3,4,3,4,5 };
cv::Mat cvm1(2, 3, CV_32SC1, m1), cvm2(2, 3, CV_32SC1, m2), mkron;
kron(cvm1, cvm2, mkron);
std::cout << mkron << std::endl;
// 输出
// [2, 3, 4, 4, 6, 8, 6, 9, 12;
//  3, 4, 5, 6, 8, 10, 9, 12, 15;
//  4, 6, 8, 6, 9, 12, 8, 12, 16;
//  6, 8, 10, 9, 12, 15, 12, 16, 20]

下面放上对应的源代码,注意,m1和m2数据类型要一致,且仅支持CV_64F, CV_32F, CV_32S, CV_16S这几种数据类型的计算。

void kron(cv::InputArray m1, cv::InputArray m2, cv::OutputArray mkron)
{int ma = m1.rows(), na = m1.cols(), mb = m2.rows(), nb = m2.cols();CV_Assert(m1.type() == m2.type() &&(m1.type() == CV_32F || m1.type() == CV_64F || m1.type() == CV_32S || m1.type() == CV_16S));cv::Mat K(ma*mb, na*nb, m1.type());cv::Mat tm1 = m1.getMat();cv::Mat tm2 = m2.getMat();cv::Rect roi;switch (m1.type()){case CV_64F:{double *_data = (double*)tm1.data;for (int i = 0; i < ma; i++){for (int j = 0; j < na; j++){roi.y = i * mb, roi.x = j * nb;roi.width = nb, roi.height = mb;tm2.convertTo(K(roi), m1.type(), _data[i*na + j]);}}K.copyTo(mkron);break;}case CV_32F:{float *_data = (float*)tm1.data;for (int i = 0; i < ma; i++){for (int j = 0; j < na; j++){roi.y = i * mb, roi.x = j * nb;roi.width = nb, roi.height = mb;tm2.convertTo(K(roi), m1.type(), _data[i*na + j]);}}K.copyTo(mkron);break;}case CV_32S:{int *_data = (int*)tm1.data;for (int i = 0; i < ma; i++){for (int j = 0; j < na; j++){roi.y = i * mb, roi.x = j * nb;roi.width = nb, roi.height = mb;tm2.convertTo(K(roi), m1.type(), _data[i*na + j]);}}K.copyTo(mkron);break;}case CV_16S:{short *_data = (short*)tm1.data;for (int i = 0; i < ma; i++){for (int j = 0; j < na; j++){roi.y = i * mb, roi.x = j * nb;roi.width = nb, roi.height = mb;tm2.convertTo(K(roi), m1.type(), _data[i*na + j]);}}K.copyTo(mkron);break;}default:break;}
}

代码的后面为了方便管理数据类型,利用switch对每个数据类型进行了判断,因此看起来冗余了许多,反正使用的时候直接粘贴就ok。

克罗内克张量积 Kron 的 OpenCV C++实现相关推荐

  1. 克罗内克内积 Kronecker product

    克罗内克内积 Kronecker product ⊗\otimes⊗ 1.1 概述 克罗内克内积是一种特殊的张量积.任何两个形状的矩阵都可以进行克罗内克内积操作. 1.2 定义 Definition ...

  2. 【基础数学】克罗内克内积 Kronecker product

    克罗内克内积 Kronecker product ⊗ 1.1 概述 克罗内克内积是一种特殊的张量积.任何两个形状的矩阵都可以进行克罗内克内积操作. 1.2 定义 Definition A⊗B的定义:A ...

  3. Kroneker Tensor:克罗内克张量

    Kroneker Tensor,克罗内克张量 Kroneker张量源自Kronecker delta函数.Kronecker delta,即克罗内克函数(又称克罗内克δ函数.克罗内克δ.克罗内克符号) ...

  4. 克罗内克函数Kronecker Delta【OI Pharos 6.2.1】

    克罗内克函数Kronecker Delta 1 定义 δij={0if i≠j,1if i=j.\delta _{{ij}}={\begin{cases}0&{\text{if }}i\neq ...

  5. 矩阵Kronecker(克罗内克)积

    Kronecker(克罗内克)积 如果A是一个 m × n 的矩阵,而B是一个 p × q 的矩阵,克罗内克积A × B则是一个 mp × nq 的分块矩阵. 在R中使用kronecker来计算两个矩 ...

  6. 克罗内克递归单元(论文翻译)

    Kronecker Recurrent Units Cijo Jose Idiap Research Institute & EPFL cijo.jose@idiap.ch Moustapha ...

  7. pyqpanda中的线路矩阵与科罗内克张量积的验证

    最近开始使用pyqpanda答题,之前一直用qiskit搭电路,初上手pyqpanda 还是有些不适应. 开始入手,本帖验证下门电路的矩阵表示以及多门多线路的矩阵表达.(完全是为了印证下数学概念的表达 ...

  8. Python求矩阵的内积、外积、克罗内克直积、Khatri-Rao积

    文章目录 矩阵乘法 内积和外积 直积 Khatri-Rao积 矩阵乘法 线性代数研究的核心对象是矩阵,所谓矩阵就是由 m m m行 n n n列的数组成的一个举行的数阵,从编程的角度理解,就是二维数组 ...

  9. Eigen实现克罗内克内积

    eigen版本3.0以上 头文件: #include<eigen3/unsupported/Eigen/KroneckerProduct> //视情况自己选择 使用样例: Eigen::M ...

  10. Kronecker克罗内克 R代码实现

    一.kronecker乘积是什么? 如果A是一个m×n的矩阵,而B是一个p×q的矩阵,克罗内克积则是一个mp×nq的分块矩阵 展开即为 举个例子 二.R代码落地 x <- matrix(1:6, ...

最新文章

  1. 维基百科联手谷歌翻译,结果“惨不忍睹”!
  2. 200余行代码,让你实时从视频中隐身
  3. python matplotlib animation制作世界人口变动动画
  4. poj 2817 WordStack (状态dp)
  5. 打印格式设置(SPAD)
  6. 我的web聊天之---序章
  7. 1.8 编程基础之多维数组 08 矩阵加法 python
  8. 原创 | 灵魂拷问:Java对象的内存分配过程是如何保证线程安全的?
  9. CUDA11.1安装教程(python3.8)
  10. unity 继承了 获取_为什么说Unity能用单纯脚本实现的功能,尽量避免继承MonoBehavior,保持纯粹性?...
  11. 服务器centos安装mysql_centos下安装mysql服务器的方法
  12. spring视频教程下载
  13. 基于java的化妆品购物商城微信小程序的设计与实现 毕业设计毕设参考
  14. 惰性学习法与kNN分类
  15. 百度地图获取经纬度的方式
  16. python输出数字三角形_Python|2020蓝桥杯之数字三角形
  17. java 图片 加边框_给图片加图片边框 图片边框要求为PNG格式
  18. shader 什么是UV
  19. 3d游戏计算机怎么配置要求吗,3DMAX软件对电脑的配置要求
  20. 如何将两个excel表格合并

热门文章

  1. 原始Young不等式
  2. 微信小程序设计稿pt怎么转rpx
  3. Ubuntu运行中文识别CHINESE
  4. 券商股票程序化交易接口(转)
  5. 10进制颜色代码,十进制颜色查询对照表
  6. 计算机生物科学论文,生物信息学论文范文
  7. 基于GPT2实现考公申论文章生成
  8. 域名检测工具图文教程
  9. 调试铁通与联通专线遇到的问题
  10. Error:(list) object cannot be coerced to type 'double'的处理