문제

나는 다음 문제에 대해 무차별적인 해결책을 찾으려고 노력하고 있습니다.임의의 크기의 행렬이 주어지면:

[6  0  3  5]
[3  7  1  4]
[1  4  8  2]
[0  2  5  9]

다음과 같이 대각선을 벡터 목록으로 변환합니다.

(0)
(1, 2)
(3, 4, 5)
(6, 7, 8, 9)
(0, 1, 2)
(3, 4)
(5)

(이 예에서는 왼쪽 아래에서 오른쪽 위로 작업)

왼쪽 열과 맨 위 행을 반복하지 않고 이 작업을 수행하는 우아한 방법이 있습니까?

도움이 되었습니까?

해결책

벡터 지수를 행렬 지수로 변환하기 위해 약간의 기능을 작성합니다.

매트릭스라고 말하십시오 NxN 정사각형이있을 것입니다 2N-1 벡터; 우리가 벡터를 숫자로 만듭니다 0 에게 2N-2, 요소 k 벡터의 n 행에있을 것입니다 max(N-1-n+k,k) 그리고 열 max(n+k-N+1,k) (또는 반대로 행렬의 행렬 요소 i, 열 j 요소가 될 것입니다 min(i,j) 벡터의 N-1+j-i). 그런 다음 벡터의 요소에 액세스해야 할 때마다 좌표를 변환하십시오. k,n 에게 i,j (즉, 벡터 지수를 매트릭스 지수로 변환하고 행렬의 적절한 요소에 액세스하십시오. 실제로 벡터 목록을 갖는 대신 에뮬레이션 벡터 목록은 목록에있는 벡터의 원하는 요소를 제공 할 수 있다는 의미에서 실제로 좋습니다. (오리 타이핑에 오신 것을 환영합니다 ;-)

그러나 매트릭스의 모든 요소에 액세스하려면 매번이 계산을 수행하는 것보다 더 빠르게 반복 할 수 있습니다.

다른 팁

(확인되지 ​​않은 코드) 이와 같은 것 (Java Code) :

// suppose m is the matrix, so basically an int[][] array with r rows and c columns
// m is an int[rows][cols];

List result = new ArrayList(rows + cols - 1);
for (int i = 0; i < (rows + cols - 1))
{
  int y;
  int x;
  if (i < rows)
  {
    x = 0;
    y = rows - i - 1;
  }
  else
  {
    x = i - rows + 1;
    y = 0;
  }
  Vector v = new Vector();
  while (y < rows && x < cols)
  {
    y++;
    x++;
    v.add(new Integer(m[y][c]));
  }
  result.add(v);
}
// result now contains the vectors you wanted

편집하다: x와 y가 섞여 있었는데 지금 수정했습니다.

수학 :

m = {{6, 0, 3, 5}, 
     {3, 7, 1, 4}, 
     {1, 4, 8, 2}, 
     {0, 2, 5, 9}};

Table[Diagonal[m, i], {i, 1 - Length@m, Length@m[[1]] - 1}]

0th Diagonal이 기본 대각선 인 I'th Diagonals의 목록을 제공합니다. i = -1은 아래의 것 등을 제공합니다. 다시 말해서, 그것은 다음과 같습니다.

{{0}, {1, 2}, {3, 4, 5}, {6, 7, 8, 9}, {0, 1, 2}, {3, 4}, {5}}

물론 내장을 사용합니다 Diagonal 기능은 일종의 부정 행위입니다. 다음은 구현입니다 Diagonal 기스로부터:

(* Grab the diagonal starting from element (i,j). *)
diag0[m_,i_,j_] := Table[m[[i+k, j+k]], {k, 0, Min[Length[m]-i, Length@m[[1]]-j]}]

(* The i'th diagonal -- negative means below the main diagonal, positive above. *)
Diagonal[m_, i_] := If[i < 0, diag0[m, 1-i, 1], diag0[m, 1, i+1]]

그만큼 Table 함수는 기본적으로 목록에 수집하는 루프입니다. 예를 들어,

Table[2*i, {i, 1, 5}]

보고 {2,4,6,8,10}.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top