Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

spdiags

0이 아닌 대각선 추출 및 희소 띠 행렬과 대각 행렬 생성

설명

예제

Bout = spdiags(A)m×n 행렬 A에서 0이 아닌 대각선을 추출하여 min(m,n)×p 행렬 Bout의 열로 반환합니다. 여기서 p는 0이 아닌 대각선 개수입니다.

예제

[Bout,id] = spdiags(A)A에서 0이 아닌 대각선의 대각선 번호 id도 반환합니다. Bout의 크기는 min(m,n)×length(id)입니다.

예제

Bout = spdiags(A,d)d에서 지정한 A의 대각선을 추출하여 min(m,n)×length(d) 행렬 Bout의 열로 반환합니다.

예제

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

예제

S = spdiags(Bin,d,A)d에서 지정한 A의 대각선을 Bin의 열로 대체합니다.

예제

모두 축소

3개의 벡터를 사용하여 삼중대각 행렬을 만들고 행렬 대각선 중 일부 대각선을 변경한 후 대각선을 추출합니다.

1로 구성된 9×1 벡터를 만든 다음, 그 벡터를 사용하여 삼중대각 행렬을 만듭니다. 행렬 요소를 확인합니다.

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

    -2     1     0     0     0     0     0     0     0
     1    -2     1     0     0     0     0     0     0
     0     1    -2     1     0     0     0     0     0
     0     0     1    -2     1     0     0     0     0
     0     0     0     1    -2     1     0     0     0
     0     0     0     0     1    -2     1     0     0
     0     0     0     0     0     1    -2     1     0
     0     0     0     0     0     0     1    -2     1
     0     0     0     0     0     0     0     1    -2

A의 주대각선(d = 0)에 있는 값을 변경합니다.

Bin = abs(-(n-1)/2:(n-1)/2)';
d = 0;
A = spdiags(Bin,d,A);
full(A)
ans = 9×9

     4     1     0     0     0     0     0     0     0
     1     3     1     0     0     0     0     0     0
     0     1     2     1     0     0     0     0     0
     0     0     1     1     1     0     0     0     0
     0     0     0     1     0     1     0     0     0
     0     0     0     0     1     1     1     0     0
     0     0     0     0     0     1     2     1     0
     0     0     0     0     0     0     1     3     1
     0     0     0     0     0     0     0     1     4

마지막으로, A의 대각선을 행렬의 열로 가져옵니다.

Bout = spdiags(A);
full(Bout)
ans = 9×3

     1     4     0
     1     3     1
     1     2     1
     1     1     1
     1     0     1
     1     1     1
     1     2     1
     1     3     1
     0     4     1

행렬에서 0이 아닌 대각선을 추출하고 spdiags의 출력 형식을 검토합니다.

0이 아닌 대각선과 0으로 이루어진 대각선이 모두 포함된 행렬을 만듭니다.

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];

행렬에서 0이 아닌 대각선을 추출합니다. 대각선 번호를 반환할 2개 출력값을 지정합니다.

[Bout,d] = spdiags(A)
Bout = 5×4

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

d = 4×1

    -3
    -2
     1
     3

첫 번째 출력값 Bout의 열에는 A의 0이 아닌 대각선이 포함됩니다. 두 번째 출력값 dA의 0이 아닌 대각선의 인덱스를 나열합니다. A에서 0이 아닌 대각선 중 가장 긴 것은 Bout의 세 번째 열에 있습니다. Bout에서 모든 열 길이를 같아지도록 하기 위해, A의 그 외 0이 아닌 대각선은 Bout에서 대응하는 열에 추가적으로 0을 갖게 됩니다. m×n 행렬(m < n)의 경우 다음 규칙이 적용됩니다.

  • A의 주대각선 아래에 있는 0이 아닌 대각선에 대해서는 (Bout의 처음 두 열에서처럼) 열 상부에 0이 추가됩니다.

  • A의 주대각선 에 있는 0이 아닌 대각선에 대해서는 (Bout의 마지막 열에서처럼) 열 하부에 0이 추가됩니다.

spdiagsBout에 가장 긴 대각선이 반환되지 않더라도 이런 방식으로 Bout을 0으로 채웁니다.

5×5 확률 행렬을 만듭니다.

A = randi(10,5,5)
A = 5×5

     9     1     2     2     7
    10     3    10     5     1
     2     6    10    10     9
    10    10     5     8    10
     7    10     9    10     7

주대각선과 주대각선 바로 위와 바로 아래에 있는 첫 번째 대각선을 추출합니다.

d = [-1 0 1];
Bout = spdiags(A,d)
Bout = 5×3

    10     9     0
     6     3     1
     5    10    10
    10     8    10
     0     7    10

5번째 상부대각선(d = 5)을 추출해 봅니다. A에는 상부대각선이 4개밖에 없으므로, spdiags는 주대각선(d = 0)과 같은 길이의 0을 대각선으로 반환합니다.

B5 = spdiags(A,5)
B5 = 5×1

     0
     0
     0
     0
     0

입력 행렬의 열이 대체하는 대각선보다 길 경우 spdiags가 어떻게 대각선을 만드는지 살펴봅니다.

숫자 1~6으로 구성된 6×7 행렬을 만듭니다.

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

     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

spdiags를 사용하여 Bin의 몇몇 열을 대각선으로 갖는 정사각 6×6 행렬을 만듭니다. 대각선의 일부는 요소가 하나 또는 두 개뿐이므로, Bin의 열 크기와 A의 대각선 크기가 일치하지 않습니다.

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

     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

Bin에 있는 각 열은 6개 요소를 갖지만, A에서는 주대각선에만 6개 요소가 있습니다. 따라서 A의 다른 모든 대각선에서는 해당 대각선에 맞도록 Bin의 열에 있는 요소를 자릅니다.

spdiags가 대각선을 자르는 방식은 m×n 행렬 A의 크기에 따라 달라집니다. mn인 경우 위 그림과 같이 동작합니다.

  • 주대각선 아래의 대각선은 열의 상부에서부터 요소를 가져옵니다.

  • 주대각선 의 대각선은 열의 하부에서부터 요소를 가져옵니다.

이 동작은 m<n인 경우 다음과 같이 반대가 됩니다.

A = spdiags(Bin,d,5,6);
full(A)
ans = 5×6

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

  • 주대각선 의 대각선은 열의 상부에서부터 요소를 가져옵니다.

  • 주대각선 아래의 대각선은 열의 하부에서부터 요소를 가져옵니다.

입력 인수

모두 축소

입력 행렬입니다. 이 행렬은 항상 그렇지는 않지만 일반적으로 비희소 행렬입니다.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

대각선 번호로, 스칼라 또는 양의 정수로 구성된 벡터로 지정됩니다. 대각선 번호는 다음과 같이 diag와 동일한 규칙을 따릅니다.

  • d < 0은 주대각선 아래쪽이고 d >= -(m-1)을 충족합니다.

  • d = 0은 주대각선을 나타냅니다.

  • d > 0은 주대각선 위쪽이고 d <= (n-1)을 충족합니다.

m×n 행렬 A에는 (m + n - 1)개의 대각선이 있습니다. -(m-1)에서 (n-1) 사이의 인덱스로 이러한 대각선을 벡터 d에 지정합니다. 예를 들어, A가 5×6인 경우, 이 행렬에는 10개의 대각선이 있을 수 있으며, 원하는 대각선을 인덱스 -4, -3, ... 4, 5를 사용하여 벡터 d에 지정할 수 있습니다. 다음 도식은 이러한 대각선 번호 체계를 보여줍니다.

A를 벗어나는 대각선(예: 위 예제의 경우 d = 7)을 지정할 경우 spdiags는 해당 대각선을 모두 0으로 반환합니다.

예: spdiags(A,[3 5])A에서 세 번째 및 다섯 번째 대각선을 추출합니다.

대각선 요소로, 행렬로 지정됩니다. 이 행렬은 항상 그렇지는 않지만 일반적으로 비희소 행렬입니다. spdiags는 지정한 A의 대각선을 Bin의 열을 사용하여 대체합니다. 요청된 출력값의 크기가 m×n일 경우 Bin에는 min(m,n)개의 열이 있어야 합니다.

S = spdiags(Bin,d,m,n) 구문에서 Bin의 열 요소가 대체하려는 대각선의 요소보다 많고 m >= n이면, spdiags는 상부대각선 요소를 Bin의 열의 에서부터 가져오고 하부대각선 요소를 Bin의 열의 에서부터 가져옵니다. 하지만 m < n이면, 상부대각선 요소를 Bin의 열의 에서부터 가져오고 하부대각선 요소를 열의 에서부터 가져옵니다. 이 동작에 대한 예는 서로 다른 크기의 열과 대각선 항목을 참조하십시오.

데이터형: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical
복소수 지원 여부:

차원 크기로, 음이 아닌 정수 스칼라로 지정됩니다. spdiags는 이러한 입력값을 사용하여 생성할 행렬의 크기를 결정합니다.

예: spdiags(Bin,d,300,400)은 지정한 대각선 dB의 열을 배치한 300×400 행렬을 생성합니다.

출력 인수

모두 축소

대각선 요소로, 비희소 행렬로 반환됩니다. Bout의 열에는 A에서 추출한 대각선이 포함됩니다. A를 벗어나는 위치에 대응하는 요소는 Bout에서 모두 0으로 설정됩니다.

대각선 번호로, 열 벡터로 반환됩니다. 대각선 번호 체계에 대한 설명은 d를 참조하십시오.

출력 행렬 S는 다음과 같은 형식으로 생성됩니다.

  • S = spdiags(Bin,d,A)의 경우, 지정한 A의 대각선이 Bin에 있는 열로 바뀌어 S가 생성됩니다.

  • S = spdiags(Bin,d,m,n)의 경우, d가 지정하는 대각선에 Bin의 열이 배치되어 m×n 희소 행렬 S가 생성됩니다.

확장 기능

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

참고 항목

|

R2006a 이전에 개발됨