2014-07-10 2 views
0

행렬을 변환하는 간단한 프로그램을 작성해야한다고 가정합니다. 각 요소는 인접 요소의 합계 여야합니다.행렬의 가장자리를 올바르게 처리하는 방법

행렬의 가장자리를 고려하여 "올바른"(가장 일반적인 가독성, 가장 효과적인 방법) 방법은 무엇입니까? 내가 생각할 수있는이 달성의

두 명백한 명백한 방법 : 첫 번째

  1. 핸들 코너 (4 별도의 줄), 나머지 가장자리를 할 4 개 루프를 사용 후 나머지
  2. 에 대한 표준 루프를 사용
  3. 전체 행렬에 대해 하나의 루프를 사용하여 if이 중간에 있는지 또는 가장 큰 경우인지 확인하십시오.

첫 번째 문제는 더 빠르지 만 (제 생각에는) 4 라인과 5 개의 루프가 필요합니다.

더 세련된 방법이 있습니까? 내가 C++로 코딩했기 때문에 나는 이것을 C++로 태그를 붙였습니다. 그리고 저는 현재 삼항 연산자 ?:이 귀여운 솔루션을 작성하는데 유용 할 것이라는 느낌을 가지고 있습니다.

솔루션은 복잡한 규칙 (오른쪽/왼쪽/아래쪽 셀 하나를 찾는 것이 아니라 특정 종류의 재귀를 수행하는 경우)에 맞게 조정할 수있는 경우 보너스 포인트입니다. 그래도 그것이 많이 바뀌면 확실하지 않습니다.

+0

"각 요소는 인접 요소의 합계 여야합니다." 3 개 이상의 요소가있는 행렬의 경우 엔트리가 어떻게 모든 0이 아닌 다른 것이 될 수 있습니까? 예를 들어 줄 수 있습니까? – Matt

+0

은 가장자리를 함수로 요약하여 캡슐화합니다. 실제로 작동하면 작동합니다. 우아함이 항상 선호되는 것은 아니지만 – Ben

+0

@Matt 죄송합니다. 매트릭스를 변형하려고했습니다. 요소는 * 인접 요소의 합이되어야합니다. 우리는 각 원소를 이웃 원소들의 합으로 교환하는 새로운 매트릭스를 만들고 있습니다. 그것은 단지 무작위적인 예입니다. 문제의 핵심은 이웃 셀을보고 예외 인 가장자리를 처리하는 것입니다. –

답변

2

세련된 방법 중 하나는 더 큰 매트릭스를 사용하는 것입니다. 행렬에 NxM 요소가있는 경우 임시 (N + 2) x (M + 2) 행렬을 만들고 0으로 채운 다음 값을 복사하십시오.

임시 (i + 1, j + 1) < - 원본 (i, j)

이제 원래의 매트릭스가 그 주위에 제로 아웃 에지로 나타납니다. 이제 임시 매트릭스에서 모든 비 - 가장자리 셀의 모든 이웃들의 합계를 안전하게 계산할 수 있습니다. 그 결과 원래 찾던 매트릭스가됩니다.

참고 - 이것은 제안한 간단한 5 루프 솔루션보다 효율적이지 않습니다.

+0

확장 행렬을 사용하여 일련의 계산을 수행 할 수있는 경우 특히 효과적입니다. –

관련 문제