(이것은 유일한 이후 나는, ATM 할 수있는 권한이 C++로 변환 가이드로 사용, D에서 컴파일)
이
template <class elt> class MatRef {
elt* m_data;
unsigned m_rows, m_cols;
unsigned m_step;
unsigned index(unsigned row, unsigned col)
{
assert(row < m_rows && col < m_cols);
return m_step * row + col;
}
public: // access
elt& operator() (unsigned row, unsigned col)
{
return m_data[index(row,col)];
}
public: // constructors
MatRef(unsigned rows, unsigned cols, elt* backing) // original matrix
: m_rows(rows)
, m_cols(cols)
, m_step(cols)
, m_data(backing)
{}
MatRef(unsigned start_row, unsigned start_col,
unsigned rows, unsigned cols, MatRef &orig) // sub-matrix
: m_rows(rows)
, m_cols(cols)
, m_step(orig.m_step)
, m_data(orig.m_data + orig.index(start_row, start_col))
{
assert(start_row+rows <= orig.m_rows && start_col+cols <= orig.m_cols);
}
};
원래 행렬 생성자는 자사의 backing
인수 포인트를 가정 등 쉽게 재귀 알고리즘을 정의 할 수 있도록하며, -), 당신은 원본과 분할 조각을 모두 처리 할 수있는 표현을 원하는 행렬 데이터를 저장하기 위해 적어도 rows*cols
길이의 데이터 요소 배열. 행렬의 크기는 데이터 멤버 m_rows
및 m_cols
에 의해 정의됩니다.
데이터 멤버 m_step
은 한 행의 시작에서 다음 행의 시작까지 얼마나 많은 데이터 요소가 있는지 나타냅니다. 원래의 행렬의 경우 이것은 m_cols
과 같습니다. 부분 행렬의 m_cols
은 그것이 참조하는 원래 행렬의 것보다 작을 수 있습니다. 이는 부분 행렬이 부분 행렬의 일부가 아닌 원래 행렬의 요소를 "건너 뛰는"방법입니다. 이 작업을 제대로 수행하려면 m_step
이 원본 매트릭스와 반드시 동일해야합니다.
매트릭스가 요소를 건너 뛰는 지 여부에 관계없이 데이터 멤버 m_data
은 항상 매트릭스의 첫 번째 요소를 가리 킵니다. 부분 행렬 생성자의 assert()
은 각 새 부분 행렬이 파생 된 행렬 내부에 맞는지 확인합니다.
"흥미로운 알고리즘"으로 간주할지 모르겠지만 부분 행렬을 정의하고 액세스하는 데 효율적이고 편리한 방법입니다.
5x5 매트릭스로 무엇을하고 싶습니까? – chikuba
안녕하세요 - 여전히 1D 매트릭스이기 때문에 작은 매트릭스 (이 경우에는 2x2 매트릭스)와 비슷한 크기의 블록으로 나눌 수 있습니다. 다음과 같이 생각했습니다 : const int ROW_BOUNDS = matrix1.size) - matrix2.size(); const int COL_BOUNDS = matrix1.size() - matrix2.size(); 이것이 어떤 의미가 있다면? – Phorce
그냥 리머 컬럼과 라인으로 무엇을합니까? – chikuba