Skip to content

Instantly share code, notes, and snippets.

@pengdu
Created April 27, 2023 08:22
Show Gist options
  • Save pengdu/4d6c2b074efeedf50305f6f4ab4551e0 to your computer and use it in GitHub Desktop.
Save pengdu/4d6c2b074efeedf50305f6f4ab4551e0 to your computer and use it in GitHub Desktop.

可以使用C++标准库中的vector来实现一个简单的2维卷积函数。以下是一个示例代码:

#include <iostream>
#include <vector>

using namespace std;

// 二维卷积函数
vector<vector<int>> conv2d(const vector<vector<int>>& img, const vector<vector<int>>& kernel)
{
    int img_rows = img.size();
    int img_cols = img[0].size();
    int kernel_rows = kernel.size();
    int kernel_cols = kernel[0].size();

    vector<vector<int>> result(img_rows - kernel_rows + 1, vector<int>(img_cols - kernel_cols + 1));

    for (int i = 0; i < result.size(); ++i)
    {
        for (int j = 0; j < result[0].size(); ++j)
        {
            int sum = 0;
            for (int k = 0; k < kernel_rows; ++k)
            {
                for (int l = 0; l < kernel_cols; ++l)
                {
                    sum += img[i + k][j + l] * kernel[k][l];
                }
            }
            result[i][j] = sum;
        }
    }

    return result;
}

int main()
{
    // 测试数据
    vector<vector<int>> img = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    vector<vector<int>> kernel = {{1, 0}, {0, 1}};

    // 二维卷积运算
    vector<vector<int>> result = conv2d(img, kernel);

    // 输出结果
    for (int i = 0; i < result.size(); ++i)
    {
        for (int j = 0; j < result[0].size(); ++j)
        {
            cout << result[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

在上面的示例代码中,conv2d函数实现了一个简单的二维卷积操作,输入为一个二维矩阵img和一个卷积核kernel,输出为卷积后的结果result。该函数使用双重循环遍历输入矩阵和卷积核,计算卷积和并存储到输出矩阵中。最后,将卷积后的结果返回。

在主函数中,我们定义了一个测试数据img和一个卷积核kernel,并调用conv2d函数进行卷积运算。最后,将卷积后的结果输出到控制台。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment