C++ cv::Mat或cv::Mat向量上的omp约化 但是,这会产生问题: OMPPIPRV=OMPJORIG,因为它会考虑 STD::向量MAT(5);及其值未定义。我怎样才能解决这个问题?我想到的唯一解决方案是创建一个包装器结构,类似于: std::vector<cv::Mat1f> mat(5); for(size_t i=0; i<mat.size(); i++) mat[i] = cv::Mat1f::zeros(1,n); 类向量{ 公众: 向量(行大小,j大小){ for(size_t i=0;i

C++ cv::Mat或cv::Mat向量上的omp约化 但是,这会产生问题: OMPPIPRV=OMPJORIG,因为它会考虑 STD::向量MAT(5);及其值未定义。我怎样才能解决这个问题?我想到的唯一解决方案是创建一个包装器结构,类似于: std::vector<cv::Mat1f> mat(5); for(size_t i=0; i<mat.size(); i++) mat[i] = cv::Mat1f::zeros(1,n); 类向量{ 公众: 向量(行大小,j大小){ for(size_t i=0;i,c++,opencv,parallel-processing,openmp,reduction,C++,Opencv,Parallel Processing,Openmp,Reduction,类型,例如cv::Mat1f,使用引用而不是复制,在这种情况下确实是危险的。您可以通过拆分并行区域和for循环来明确解决问题 class vectMat{ public: vectMat(size_t rows, size_t j){ for(size_t i=0; i<rows; i++) mats.push_back(cv::Mat1f::zeros(1,j)); } private: std::vector<cv:

类型,例如
cv::Mat1f
,使用引用而不是复制,在这种情况下确实是危险的。您可以通过拆分
并行
区域和
for
循环来明确解决问题

class vectMat{
public:
    vectMat(size_t rows, size_t j){
        for(size_t i=0; i<rows; i++)
            mats.push_back(cv::Mat1f::zeros(1,j));
    }
private:
    std::vector<cv::Mat1f> mats;
};
#pragma omp声明缩减(vec_mat1f_plus:std::vector:\
std::transform(omp_out.begin()、omp_out.end()、omp_in.begin()、omp_out.begin()、std::plus());
//如果显式初始化,则不需要初始值设定项
std::向量矩阵;
#pragma omp并行缩减(vec_mat1f_plus:mat)
{
mat=std::vector(5);
用于(自动和电气:mat){
elem=cv:Mat1f::零(1,n);
}
#pragma omp for

对于(size_t i=0;我想知道你的答案。我过于简化了我的示例,请看我更新的question@justHelloWorld我更新了你更新的问题的答案。我想我没有得到你需要的答案。谢谢你的更新。但是,在本代码末尾,mat.size()=0
:(当然如果是0:我在还原之前没有初始化
mat
(对我来说太蠢了)。我编辑了你的问题(第一次这样做,我不知道它是如何工作的:D)你说“每行的每个元素都是随机初始化的”是什么意思?@Zulan在前面的例子中,不同的行是“链接的”,所以我不能像第一种情况那样初始化
mat
,但是
omp_priv=omp_orig
有问题,你不这样认为吗?@Zulan请看一下我提出的问题
std::vector<cv::Mat1f> mat(5);
for(size_t i=0; i<mat.size(); i++)
  mat[i] = cv::Mat1f::zeros(1,n);
class vectMat{
public:
    vectMat(size_t rows, size_t j){
        for(size_t i=0; i<rows; i++)
            mats.push_back(cv::Mat1f::zeros(1,j));
    }
private:
    std::vector<cv::Mat1f> mats;
};
#pragma omp declare reduction(vec_mat1f_plus : std::vector<cv::Mat1f> : \
            std::transform(omp_out.begin(), omp_out.end(), omp_in.begin(), omp_out.begin(), std::plus<cv::Mat1f>()));
// initializer not necessary if you initialize explicitly

std::vector<cv::Mat1f> mat;
#pragma omp parallel reduction(vec_mat1f_plus : mat)
{
  mat = std::vector<cv::Mat1f>(5);
  for (auto& elem : mat) {
    elem = cv:Mat1f::zeros(1, n);
  }
  #pragma omp for
  for(size_t i=0; i<m; i++){
    mat[indexes[m]] += 1;
  }
}