이 페이지의 최신 내용은 아직 번역되지 않았습니다. 최신 내용은 영문으로 볼 수 있습니다.

spdiags

희소 띠 행렬과 대각 행렬 추출 및 생성

구문

B = spdiags(A)
[B,d] = spdiags(A)
B = spdiags(A,d)
A = spdiags(B,d,A)
A = spdiags(B,d,m,n)

설명

spdiags 함수는 함수 diag를 일반화합니다. 입력 인수 개수에 따라 서로 다른 총 네 가지 연산이 가능합니다.

B = spdiags(A)mxn 행렬 A에서 0이 아닌 모든 대각 행렬을 추출합니다. Bmin(m,n)xp 행렬이고 이 행렬의 열은 A에서 0이 아닌 p개의 대각 행렬입니다.

[B,d] = spdiags(A)는 길이 p의 벡터 d를 반환하는데 이 벡터의 정수 성분은 A의 대각 행렬을 지정합니다.

B = spdiags(A,d)d에서 지정한 대각선을 추출합니다.

A = spdiags(B,d,A)d에서 지정한 대각선을 B의 열로 대체합니다. 출력값은 희소 행렬입니다.

A = spdiags(B,d,m,n)B의 열을 가져와서 d에서 지정한 대각 행렬에 배치하여 mxn 희소 행렬을 만듭니다.

참고

이 구문에서 B의 열이 대체하는 대각선보다 길고 m >= n인 경우, spdiagsB의 열 중 하부에서 상부 대각 요소를 가져오고 B의 열 중 상부에서 하부 대각 요소를 가져옵니다. 하지만 m < n인 경우, 상부 대각선은 B의 열 중 상부에서 가져오고 하부 대각선은 열의 하부에서 가져옵니다. (아래의 예제 5A 항목과 예제 5B 항목을 참조하십시오.)

인수

spdiags 함수는 다양한 조합의 세 개 행렬을 입력값과 출력값 모두로 취급합니다.

A

mxn 행렬로, 일반적으로 (꼭 그렇지는 않지만) 희소 행렬이고, 이 행렬의 0이 아닌 요소 또는 지정한 요소는 p개 대각선상에 있습니다.

B

min(m,n)xp 행렬로, 일반적으로 (꼭 그렇지는 않지만) 비희소 행렬이고, 이 행렬의 열은 A의 대각 행렬입니다.

d

길이 p의 벡터로, 이 벡터의 정수 성분이 A에서 대각 행렬을 지정합니다.

대략, ABd는 다음과 같은 관계식을 가집니다.

for k = 1:p
    B(:,k) = diag(A,d(k))
end

A의 외부 위치에 대응하는 B의 일부 요소는 이러한 루프로 정의되지 않습니다. 이들 요소는 B가 입력값인 경우에는 참조되지 않고 B가 출력값인 경우에는 0으로 설정됩니다.

A의 대각 행렬이 벡터 d에 나열되는 방식

mxn 행렬 A에는 m+n-1개의 대각 행렬이 있습니다. 이러한 대각 행렬은 -m+1 ~ n-1 범위의 인덱스를 사용하여 벡터 d에서 지정됩니다. 예를 들어, A가 5x6인 경우, 이 행렬에는 10개의 대각 행렬이 있으며, 이 대각 행렬은 인덱스 -4, -3, ... 4, 5를 사용하여 벡터 d에서 지정됩니다. 다음 도식은 이 경우를 모두 1로 구성된 벡터에 대해 설명합니다.

예제

예제 1

다음 행렬의 경우,

A=[0 5 0 10 0 0;...
0 0 6 0 11 0;...
3 0 0 7 0 12;...
1 4 0 0 8 0;...
0 2 5 0 0 9]

A =

     0     5     0    10     0     0
     0     0     6     0    11     0
     3     0     0     7     0    12
     1     4     0     0     8     0
     0     2     5     0     0     9

다음 명령을 실행하면

[B, d]  =spdiags(A)

다음 결과가 반환됩니다.

B =

     0     0     5    10
     0     0     6    11
     0     3     7    12
     1     4     8     0
     2     5     9     0


d =


    -3
    -2
     1
     3

첫 번째 출력값 B의 열에는 A의 0이 아닌 대각 행렬이 포함됩니다. 두 번째 출력 d는 다음 도식에 나와 있는 대로, A의 0이 아닌 대각 행렬 인덱스를 나열합니다. A의 대각 행렬이 벡터 d에 나열되는 방식 항목을 참조하십시오.

A에서 가장 긴 0이 아닌 대각 행렬은 B의 세 번째 열에 포함되어 있습니다. A의 다른 0이 아닌 대각 행렬은 B에서 대응하는 열에 추가적으로 0을 더하여 B의 모든 열 길이가 같아졌습니다. A의 주대각선 아래에 있는 0이 아닌 대각 행렬에 대해서는 열 상부에 0이 추가됩니다. A의 주대각선 위에 있는 0이 아닌 대각 행렬에 대해서는 열 하부에 0이 추가됩니다. 다음 도식에 이 과정이 설명되어 있습니다.

예제 2

이 예제는 n개 점에서 기본 두 번째 차분 연산자의 희소 삼중대각 표현을 생성합니다.

e = ones(n,1);
A = spdiags([e -2*e e], -1:1, n, n)

이 행렬을 윌킨슨(Wilkinson)의 테스트 행렬로 바꿉니다(gallery 참조).

A = spdiags(abs(-(n-1)/2:(n-1)/2)',0,A)

마지막으로, 세 개의 대각 행렬을 복구합니다.

B = spdiags(A)

예제 3

두 번째 예는 정사각 행렬이 아닙니다.

A = [11    0   13    0
      0   22    0   24
      0    0   33    0
     41    0    0   44
      0   52    0    0
      0    0   63    0
      0    0    0   74]

여기서 m =7, n = 4, p = 3입니다.

명령문 [B,d] = spdiags(A)d = [-3 0 2]'를 생성하고

B = [41   11    0
     52   22    0
     63   33   13
     74   44   24]

역으로, 위의 Bd를 사용한 표현식 spdiags(B,d,7,4)는 원래 A를 재현합니다.

예제 4

이 예제는 B의 열이 대체하는 대각 행렬보다 길 경우 spdiags가 대각 행렬을 만드는 방식을 보여줍니다.

B = repmat((1:6)',[1 7])

B =

    1  1  1  1  1  1  1
    2  2  2  2  2  2  2
    3  3  3  3  3  3  3
    4  4  4  4  4  4  4
    5  5  5  5  5  5  5
    6  6  6  6  6  6  6

d = [-4 -2 -1 0 3 4 5];
A = spdiags(B,d,6,6);
full(A)

ans =

  1  0  0  4  5  6
  1  2  0  0  5  6
  1  2  3  0  0  6
  0  2  3  4  0  0
  1  0  3  4  5  0
  0  2  0  4  5  6

예제 5A

이 예제는 다음 세 가지 조건 하에서, 구문 A = spdiags(B,d,m,n)을 사용하는 경우를 설명합니다.

  • mn와 같음

  • mn보다 큼

  • mn보다 작음

이 예제에서 사용되는 명령은 다음과 같습니다.

A = full(spdiags(B, [-2 0 2], m, n))

여기서, B는 아래에 표시된 5x3 행렬입니다. 결과로 나타나는 행렬 A의 차원은 mxn이고 [-2 0 2]에 0이 아닌 대각 행렬이 있습니다(하부 대각 행렬(-2), 주대각선, 상부 대각 행렬(2)).

B = [1    6   11
     2    7   12
     3    8   13
     4    9   14
     5   10   15]

행렬 B의 첫 번째 열과 세 번째 열을 사용하여 A의 하부 대각 행렬과 상부 대각 행렬을 각각 만듭니다. 세 가지 경우 모두 B의 첫 번째와 세 번째 외부 열이 결과로 나타나는 A의 대각선보다 깁니다. 이 때문에, 열의 일부만 A에서 사용됩니다.

m == n이거나 m > n인 경우, spdiagsB의 대응하는 열 하부에서 A의 상부 대각 요소를 가져오고, B의 대응하는 열 상부에서 A의 하부 대각 요소를 가져옵니다.

A = full(spdiags(B, [-2 0 2], 5, 5))
 Matrix B                      Matrix A

1    6   11                 6    0   13    0    0
2    7   12                 0    7    0   14    0
3    8   13  == spdiags =>  1    0    8    0   15
4    9   14                 0    2    0    9    0
5   10   15                 0    0    3    0   10

A(3,1), A(4,2), A(5,3)B(:,1)의 상부에서 가져옵니다.

A(1,3), A(2,4), A(3,5)B(:,3)의 하부에서 가져옵니다.

A = full(spdiags(B, [-2 0 2], 5, 4))
 Matrix B                      Matrix A

1    6   11                 6    0   13    0
2    7   12                 0    7    0   14
3    8   13  == spdiags =>  1    0    8    0
4    9   14                 0    2    0    9
5   10   15                 0    0    3    0

Part A와 동일합니다.

m < n인 경우, spdiags는 반대로, B의 대응하는 열 상부에서 A의 상부 대각 요소를 가져오고, B의 대응하는 요소 하부에서 A의 하부 대각 요소를 가져옵니다.

A = full(spdiags(B, [-2 0 2], 4, 5))
 Matrix B                      Matrix A

1    6   11                 6    0   11    0    0
2    7   12                 0    7    0   12    0
3    8   13  == spdiags =>  3    0    8    0   13
4    9   14                 0    4    0    9    0
5   10   15

A(3,1)A(4,2)B(:,1)의 하부에서 가져옵니다.

A(1,3), A(2,4), A(3,5)B(:,3)의 상부에서 가져옵니다.

예제 5B

다음 명령을 사용하여 다시 이 예제의 첫 번째 부분에서 대각 행렬을 열 형식으로 추출합니다.

B = spdiags(A)

각 경우에서 원래 열이 복원됨을 확인할 수 있습니다(행렬 A의 상부 대각 행렬과 하부 대각 행렬에서 넘쳐진 요소는 제외함).

      Matrix A                        Matrix B

6    0   13    0    0                 1   6   0
0    7    0   14    0                 2   7   0
1    0    8    0   15  == spdiags =>  3   8  13
0    2    0    9    0                 0   9  14
0    0    3    0   10                 0  10  15
    Matrix A                     Matrix B

6    0   13    0                 1   6   0
0    7    0   14                 2   7   0
1    0    8    0  == spdiags =>  3   8  13
0    2    0    9                 0   9  14
0    0    3    0
      Matrix A                        Matrix B

6    0   11    0    0                 0   6  11
0    7    0   12    0                 0   7  12
3    0    8    0   13  == spdiags =>  3   8  13
0    4    0    9    0                 4   9   0

확장 기능

C/C++ 코드 생성
MATLAB® Coder™를 사용하여 C 코드나 C++ 코드를 생성할 수 있습니다.

참고 항목

|

R2006a 이전에 개발됨