2014-06-10 1 views
-1

예를 들어 COO 및 CSR 형식 (here이 아닌 경우)에서 저장된 다음 행렬 B가 있습니다. MATLAB sum(B,2) 함수를 coo 또는 csr (또는 둘 다) 형식을 사용하여 적용하는 효율적인 C++ 방법을 제안 해 주시겠습니까? 대형 어레이로 작업하는 것이 가능하기 때문에 병렬 프로그래밍 (omp 또는 CUDA (예 : 추력))을 사용하여 수행 할 수 있습니까?CSR 또는 COO 형식을 사용하여 행렬의 행 합계를 찾습니다.

임의의 알고리즘 또는 라이브러리 기반 제안은 매우 높이 평가됩니다. 감사합니다.

추신 : 코드가 희박한 행렬을 구성하고 CSR 좌표를 얻는 코드는 예를 들어 this 답의 게시물에서 찾을 수 있습니다.

enter image description here

COO 형식 :CSR 형식 : COO를 들어

 row_index col_index value     columns row_index value 
      1   1   1      0   0  1 
      1   2  -1      1   3  -1 
      1   3  -3      3   5  -3 
      2   1  -2      0   8  -2 
      2   2   5      1   11  5 
      3   3   4      2   13  4 
      3   4   6      3     6 
      3   5   4      4     4 
      4   1  -4      0    -4 
      4   3   2      2     2 
      4   4   7      3     7  
      5   2   8      1     8 
      5   5  -5      4    -5 
+1

[Cusp library] (https://github.com/cusplibrary/cusplibrary)를 살펴보십시오. –

답변

1

는 아주 간단합니다 :

struct MatrixEntry { 
    size_t row; 
    size_t col; 
    int value; 
}; 

std::vector<MatrixEntry> matrix = { 
    { 1, 1, 1 }, 
    { 1, 2, -1 }, 
    { 1, 3, -3 }, 
    { 2, 1, -2 }, 
    { 2, 2, 5 }, 
    { 3, 3, 4 }, 
    { 3, 4, 6 }, 
    { 3, 5, 4 }, 
    { 4, 1, -4 }, 
    { 4, 3, 2 }, 
    { 4, 4, 7 }, 
    { 5, 2, 8 }, 
    { 5, 5, -5 }, 
}; 

std::vector<int> sum(5); 

for (const auto& e : matrix) { 
    sum[e.row-1] += e.value; 
} 

대형 매트릭스를 위해 당신은 단지의 분할 수 여러 개의 작은 범위로 반복하고 끝에 결과를 추가하십시오. 당신은 각 행의 합계가 필요한 경우

CSR은 정직 (심지어 더 효율적)도 (그리고 columwise되지 않음) :

std::vector<int> row_idx = { 0, 3, 5, 8, 11, 13 }; 
std::vector<int> value = { 1, -1, -3, -2, 5, 4, 6, 4, -4, 2, 7, 8, -5 }; 

std::vector<int> sum(5); 

for(size_t i = 0; i < row_idx.size()-1; ++i) { 
    sum[i] = std::accumulate(value.begin() + row_idx[i], value.begin() + row_idx[i + 1], 0); 
} 

다시 병렬 처리를 위해 당신은 단순히 루프를 분할 할 수 있습니다.

+0

불행히도 OpenMP 사용에 대한 경험이 없기 때문에 이것은 추측 일뿐입니다. CSR의 경우 수정없이 가능해야합니다. COO의 경우 합계 벡터의 값이 수정되면 경쟁 조건이 발생할 수 있습니다. 이를 해결하는 가장 효과적인 방법은 아마도 수동으로 루프를 나눠서 병렬로 파트를 실행 한 다음 결과를 끝에 추가하는 것입니다. – MikeMB

+0

죄송합니다, 실수로 내 코멘트를 삭제합니다. 다음 댓글은 MikeMB의 마지막 코멘트보다 앞서갑니다 : (size_t i = 0; i Thoth

+0

또는 CSR 표현으로부터'row_idx' 배열을 수동으로 생성하고 그곳에 보여지는 알고리즘을 사용할 수 있습니다. – MikeMB

관련 문제