c++ - 将 3-dim cv::Mat 嵌入 4-dim cv::Mat
问题描述
我必须将 3 维嵌入cv::Mat
到 4 维中。
一些上下文
给定:我有一些执行深度卷积的代码,即我有一个 3-dim 输入矩阵 {channels, w_in, h_in} 和一个 3-dim 3-by3 内核 {channels, 3, 3} 以产生 3-dim 输出{频道,w_out,h_out}。深度卷积现在意味着内核的第一个切片应用于输入的第一个切片以产生输出的第一个切片,依此类推。
我需要什么:我想使用需要 4-dim 内核的标准卷积来重建这种类型的卷积。在 python (pytorch) 中,我可以执行以下操作:
kernel4d = torch.tensor((), dtype=torch.float32)
kernel4d = kernel4d.new_zeros((channels, channels, 3, 3))
for i in range(channels):
kernel4d[i, i, :, :] = kernel3d[i, :, :]
如何使用 C++ 有效地重写此代码cv::Mat
?
编辑
int size3d[] = {3, 5, 5};
cv::Mat kernel3d = cv::Mat(3, size3d, CV_32F, cv::Scalar(0));
int size4d[] = {3, 3, 5, 5};
cv::Mat kernel4d = cv::Mat(4, size4d, CV_32F, cv::Scalar(1));
// Try 1
for (int i = 0; i < 3; i++){
kernel4d.at<float>(i, i) = kernel3d.at<float>(i);
}
// Result: Sets only single values at (i, i, 0, 0)
// Try 2
for (int i = 0; i < 3; i++){
for (int k = 0; k < 5; k++){
for (int l = 0; l < 5; l++){
kernel4d.at<float>(i, i, k, l) = kernel3d.at<float>(i, k, l);
}
}
}
// Result: at does not exept 4 indexes
解决方案
推荐阅读
- r - R 错误:“参数暗示不同的行数”——但经过检查,大小是相同的
- arrays - TCL列表数据转直方图
- flutter - 如何断言占位符文本在 Flutter 小部件测试中消失?
- javascript - 在分析 gtag 中获取 window.location.hostname
- openrefine - 如何添加减去两个现有列之间差异的列?OpenRefine 中的 GREL
- ios - Xcode 11 | 运行命令 Instruments -s devices | CoreData XRPackageModel 错误
- r - 如何为 diff() 设置单位?
- html - 使用 ::after 和 ::before 超出填充范围
- python - Collectstatic 在使用 s3boto3 和 manifestfilemixin 时提供 NoSuchKey
- pdf - 在 Flutter / Dart 中打印通过 web 服务下载的 pdf