我有一个整数矩阵,例如:
1 0 1
2 1 0
1 1 1
这是一个微不足道的例子;我的问题比这个例子大得多(想象2000 x 2000)。我必须按照这个规则修改矩阵:我必须做两个步骤:(1)如果矩阵中1
下面的元素是0,那么我的移动应该是"1"
,然后( 2)如果矩阵中2
右边的元素为0,我的移动应该是"2"
。
我正在使用两个向量来保存一个和两个的位置。这些向量是std::vector<triplet>
,其中三元组是struct
来处理问题:
struct triplet{
int row, column, move;
};
因此vector1
的每个元素都包含1(行和列)的位置和变量move(即0或1)以显示我是否可以移动相关的1。
我对载体2分别做了同样的事情。
void modifyvector1(vector<vector<int>>& matrix,vector<triplet>& vector1,int nrow,int ncolumn)
{
#pragma omp parallel for
for (int scorriblu = 0; scorriblu < vector1.size(); scorriblu++) {
int i = vector1[scorriblu].row;
int j = vector1[scorriblu].column;
vector1[scorriblu].move = 0;
if(i != nrow) {
if (matrix[i+1][j] == EmptySpace) {
vector1[scorriblu].move = 1;
}
}
else {
if (matrix[0][j] == EmptySpace) {
vector1[scorriblu].move = 1;
}
}
}
}
但是,这个程序比串行慢。我认为主要问题是每个线程都试图访问存储在共享内存中的矩阵,这导致了巨大的不同。但我不确定这是问题,以及如何解决它。
很抱歉我的解释,但我是C ++和OpenMP的新手。