매트릭스 곱셈

매트릭스 곱셈

그래서, 이전 공과에서는, 행렬의 첨가와 뺄셈에 대한 규칙을 분해합니다. 이것들은 대부분의 학생들이 그대로 그대로 그대로 이해할 수있는 간단한 조작입니다.

그러나, 당신은 일찍 기뻐합니다. Freebie가 끝났습니다. 곱하기로 이동합니다. 즉시 나는 당신을 경고합니다 : 두 개의 행렬이 곱하기와 동일한 좌표로 숫자에 숫자를 곱하고 있지 않습니다. 모든 것이 훨씬 더 재미 있습니다. 예비 정의로 시작합니다.

일관된 행렬

매트릭스의 가장 중요한 특성 중 하나는 크기입니다. 우리는 이미 100 번에 대해 이야기했습니다. 기록 $ a = \ 왼쪽 [m \ times n \ right] $는 매트릭스 정확하게 $ m $ 행과 $ n $ 열에있는 것을 의미합니다. 열과 함께 행을 혼동하지 않는 방법은 이미 토론했습니다. 이제는 중요합니다.

정의. $ a = \ left] $ 및 $ b = \ left] $ 및 $ b = \ left] $의 행렬은 첫 번째 매트릭스의 열 수가 두 번째 행의 행 수와 일치하는 것입니다. ~라고 불리는 일관된 .

다시 한번 : 첫 번째 행렬의 열 수는 두 번째 행의 행 수와 같습니다! 여기에서 우리는 한 번에 두 개의 출력을 얻습니다.

  1. 우리는 매트릭스의 순서에 중요합니다. 예를 들어, 매트릭스 $ a = 왼쪽 [3 \ times 2 \ right] $ 및 $ b = \ left [2 \ times 5 \ right] $는 합의됩니다 (첫 번째 매트릭스와 두 번째 행렬의 2 줄 2 열) 그러나 반대로 - 행렬 $ b = \ 왼쪽 [2 \ times 5 \ right] $ a = \ left [3 \ times 2 \ right] $ - 더 이상 동의하지 않았습니다 (첫 번째 매트릭스의 5 열) 두 번째 줄에 3 줄).
  2. 일관성은 서로의 모든 크기를 기록하는지 확인하기 쉽습니다. 이전 단락의 예 : "3 2 2 5"- 중간에 동일한 숫자이므로 매트릭스가 합의됩니다. 그러나 "2 5 3 2"- 동의하지 않았습니다. 중간에는 다른 숫자가 있습니다.

또한, 캡틴은 동일한 양의 $ \ times n \ right의 사각 행렬이 항상 일관되게 일관되게하는 것처럼 캡틴이 싫어합니다.

수학에서는 객체를 전송하는 절차가 중요합니다 (예를 들어, 위의 정의에서 행렬의 절차가 중요합니다). 종종 정렬 된 쌍에 대해 이야기합니다. 우리는 학교에서 그들과 만났습니다. 나는 또한 $ \ left (1, 0 \ right) $와 $ \ 왼쪽 (0; 1 \ right) $의 좌표가 비행기에서 다른 지점을 설정한다는 것이 분명하다고 생각합니다.

그래서 : 좌표는 숫자로부터 컴파일 된 쌍을 순서대로 주문합니다. 그러나 그러한 한 쌍의 행렬을 방지하는 것은 없습니다. 그런 다음 "$ \ 왼쪽 매트릭스 (a; b \ right)의 주문한 쌍 (a; b \ right) $는 첫 번째 행렬의 열 수가 두 번째 행의 행 수와 일치하면 일관성이 있습니다."

글쎄, 그래서?

곱셈의 정의

$ a = \ left [m \ times n \ right] $ 및 $ b = 왼쪽 [n \ time k \ left] $. 우리는 곱셈 작업을 정의합니다.

정의. 두 합의 된 행렬의 일 $ a = \ left] $ = \ left] $ = \ left] $는 수식으로 고려한 요소가있는 새 행렬 $ C = \ 왼쪽 [m \ times k \ right] $입니다.

\ [\ begin {Align} {{{c} _ {{}} = {{}} \ cdot {{b} _ _ {1; j}} + {{a} _ {i; 2}} \ cdot {{b} _ {2; j}} + \ ldots + {{a} _ {{b} _ \ cdot {{b} _ \ \ \\ & = \ sum \ limits_ {t = 1} ^ {n} {{{a} {{}} \ cdot {{b} _ \ cdot {j}}} \ end {정렬} \

표준은 표준입니다 : $ c = a \ cdot b $.

제 의견으로는 모든 것이 분명합니다. 다음으로 읽을 수 없습니다. [설마]

이 정의를 처음 보는 사람들을 위해서는 두 가지 질문이 즉시 발생합니다.

  1. 게임은 무엇입니까?
  2. 왜 그렇게 어렵습니까?

음, 모든 것에 대해서는 순서대로. 첫 번째 질문으로 시작합시다. 이 모든 인덱스는 무엇을 의미합니까? 실제 행렬로 일할 때 실수를하지 않는 방법은 무엇입니까?

우선, $ {{C} _ {i; j}} $ (특별히 지수 사이에 세미콜론과 함께 한 지점을 두드리지 않도록 할 필요가 없지만 넣을 필요가 없습니다. 그들에게 일반적으로 나는 나 자신이 정의 된 수식을 형성하는 것을 아프게합니다.) 실제로 간단한 규칙으로 나옵니다.

  1. 첫 번째 행렬에서 $ i $ -un line을 취합니다.
  2. 우리는 두 번째 매트릭스에서 $ J $ -A 열을 찍습니다.
  3. 우리는 두 번의 숫자를 얻습니다. 동일한 숫자로 이러한 시퀀스의 항목을 대체하고 획득 한 작업을 접습니다.

이 프로세스는 사진을 쉽게 이해할 수 있습니다.

두 매트릭스의 곱셈 ​​다이어그램

다시 한 번 : 첫 번째 행렬에 $ i $를 수정하고 두 번째 행렬의 $ j $ 열을 수정하고 같은 숫자로 요소를 변경 한 다음 획득 된 작업이 접혀 있습니다 - $ {{C} _ _} ij}} $. 그리고 모든 $ 1 \ le i \ le m $ 그리고 $ 1 \ le j \ le k $. 저것들. 총 $ M + Times k $의 "efrondions"가있을 것입니다.

사실, 우리는 이미 학교 프로그램의 매트릭스를 강력하게 트림 된 형태로 곱한 것으로 만났습니다. 벡터를합시다 :

\ [\ begin {a} = \ left ({} = \ \ {x} _ {a}}} {y} _ _}}; {{z} _ {a}} \ right); \\ \ \ \ 왼쪽 ({{{\} _ _}}}; {{y} _ {b}}; {{z} _ {b}} \ right). \\ \ end {정렬} \ \

그런 다음 스칼라 작업은 쌍으로 작동하는 양입니다.

\ [\ times \ times \ times {}} {{{x} _ {a}} \ cdot {{}} _ \ cdot {{}} _ _ _} + {{y} _ {a}} \ cdot {{} } _ {b}} + {{z} _ {a}} \ cdot {{z} _ _ {b}} \ \]

사실, 그 멀리서 나무가 푸르고 하늘이 더 밝아지면 $ \ everigratearrow {b} $ \} $ Vector 컬럼에 $ \ offlightarrow {a} $ Vector를 곱한 것입니다.

오늘은 아무 것도 바뀌지 않았습니다. 이제 이러한 행과 열이 더 많아졌습니다.

그러나 충분한 이론! 실제 사례를 살펴 보겠습니다. 가장 단순한 경우에서 시작하십시오 - 사각형 매트릭스.

정사각형 매트릭스를 곱하십시오

작업 1. 곱셈을 수행하십시오.

\ [\ left [\ begin {ray} {* {35} {r} {* {35} \\\ \ \ -3 & 4 \\\ end {array} \ right] \ cdot \ left [\ begin {array} {* {35} {r}} -2 & 4 \\ 3 & 1 \\ end {배열} \ 오른쪽] \

해결책. 그래서, 우리는 2 개의 행렬이 있습니다 : $ a = \ left [2 \ times 2 \ right] $ 및 $ b = \ 왼쪽 [2 \ times 2 \ right] $. 그들이 합의 된 것은 분명합니다 (같은 크기의 정사각형 매트릭스는 항상 일관성이 부족합니다). 따라서 곱셈을 수행합니다.

\ [\ begin {Align} \ \ left [\ begin {array} {* {35} {r}} \\ -3 & 4 \\ end {배열} \ 오른쪽] \ cdot \ 왼쪽 [\ 시작 {Array} {* {35} {*}} -2 & 4 \\ 3 & 1 \\ end {array} \ right] = \ left [\ begin {array} {* {35} {r}} 1 \ CDOT \ 왼쪽 (-2 \ 오른쪽) +2 \ CDOT 3 & 1 \ CDOT 4 + 2 \ CDOT 1 \\ -3 \ CDOT \ 왼쪽 (-2 \ 오른쪽) +4 \ CDOT 3 & -3 \ CDOT 4 + 4 \ CDOT 1 \\\ end {array} \ right] = \\ \ = \ left [\ begin {배열} {* {35} {r}} 4 & 6 \ 18 & -8 \\\ end { 배열} \ right]. \ end {정렬} \]

그게 다야!

답변 : $ \ 왼쪽 [\ begin {ray} {* {35} {r}} 4 & 6 \ 18 & -8 \\\ end {배열} \ right] $.

작업 2. 곱셈을 수행하십시오.

\ [\ left [\ begin {matrix} 1 & 3 \ 2 & 6 \\ end {matrix} \ right] \ cdot \ left [\ begin {배열} {* {35} {r}} 9 & 6 \ \ -3 & -2 \\\ end {배열} \ right] \]

해결책. 동의 한 행렬을 다시, 조치를 수행하십시오 : \ [\]

\ [\ begin {정렬} & \ 왼쪽 [\ begin {Matrix} 1 & 3 \\ 2 & 6 \\ end {matrix} \ right] \ cdot \ left [\ begin {array} {* {35} {r }} 9 & 6 \\ -3 & -2 \\ end {array} \ right] = \ left [\ begin {배열} {* {35} {r}} 1 \ CDOT 9 + 3 \ CDOT \ left ( -3 \ 오른쪽) & 1 \ CDOT 6 + 3 \ CDOT \ 왼쪽 (-2 \ 오른쪽) \\ 2 \ CDOT 9 + 6 \ CDOT \ 왼쪽 (-3 \ 오른쪽) & 2 \ CDOT 6 + 6 \ CDOT \ 왼쪽 (-2 \ 오른쪽) \\\ end {array} \ right] = \\ & = \ 왼쪽 [\ begin {matrix} 0 & 0 \\ 0 & 0 \\ end {matrix} \ right]. \ end {정렬} \]

우리가 보면, 그것은 0으로 가득 찬 행렬을 밝혀 냈습니다.

답변 : $ \ 왼쪽 [\ begin {matrix} 0 & 0 \\ 0 \\\ end {matrix} \ right] $.

위의 예제에서, 매트릭스의 곱셈이 이러한 어려운 작동이 아니라는 것은 명백하다. 적어도 크기 2 × 2의 정사각형 매트릭스.

계산 과정에서 우리는 중간 매트릭스를 구성하고, 여기서 직접 페인트, 하나 또는 다른 셀에 포함 된 숫자가 포함됩니다. 이러한 작업을 해결할 때 어떻게 해야하는지입니다.

매트릭스 작업의 주요 특성

간단히 말해서. 매트릭스 곱셈 :

  1. 비병합 : $ a \ cdot b \ n b \ cdot 일반 경우에 $ a $. 물론, 평등이 $ a \ cdot b = b \ cdot a $ (예 : $ b = e $가 단일 매트릭스 임) 인 특수 행렬이 있지만 대부분의 경우 작동하지 않습니다.
  2. 연관성 : $ \ 왼쪽 (a \ cdot b \ right) \ cdot c = a \ cdot \ left (b \ cdot c \ right) $. 옵션이없는 경우 : 행렬 옆에 서있는 것은 다음 두 매트릭스의 다음과 오른쪽에 생존하지 못할 수 있습니다.
  3. 배포 : $ a \ cdot \ left (b + c \ right) = a \ cdot b + a \ cdot c $ 및 $ \ 왼쪽 (a + b \ 왼쪽) \ cdot c = a \ cdot c + b \ cdot c $ (비 통신적 이기도로 인해 작업은 오른쪽에 배포를 규정해야합니다.

그리고 지금 - 모두 동일하지만 더 자세히.

매트릭스의 곱셈은 크게 숫자의 곱셈을 크게 연상시킵니다. 그러나 차이점이 있습니다. 가장 중요한 것은 일반적으로 말하기, 비 통신적 인 행렬의 곱셈 .

다시 한 번 작업 1의 행렬을 고려하십시오. 우리는 이미 직접적인 작업을 알고 있습니다.

\ [\ left [\ begin {ray} {* {35} {r} {* {35} \\\ \ \ -3 & 4 \\\ end {array} \ right] \ cdot \ left [\ begin {array} {* {35} {r}} -2 & 4 \\ 3 & 1 \\\ end {array} \ right] = \ left [\ begin {array} {* {35} {r}} 4 & 6 \ 18 & -8 \\\ end {배열} \ right] \]

그러나 어떤 장소에서 행렬을 바꾸면 완전히 다른 결과를 얻을 것입니다.

\ [\ left [\ begin {array} {* {35} {r} {* {35} {r}} -2 & 4 \\ 3 & 1 \\\ end {배열} \ 오른쪽] \ cdot \ left [\ begin {array} {* {35} {r}} 1 & 2 \\ -3 & 4 \\\ end {array} \ right] = \ left [\ begin {matrix} -14 & 4 \\ 0 & 10 \\\ end {matrix } \ 오른쪽] \]

$ a \ cdot b \ n b \ cdot a $를 밝힙니다. 또한 곱셈 연산은 조정 된 행렬 $ a = \ left [m \ times n \ right] $ 및 $ b = \ 왼쪽 [n \ time k \ left] $에만 정의되지만 아무도 남아 있을지 보증하지 않습니다. 그들이 장소에서 그들을 바꾸면 동의했다. 예를 들어 $ \ 왼쪽 매트릭스 [2 \ times 3 \ right] $ and $ \ left [3 \ times 5 \ right] $는 지정된 순서로 일관되지 않지만 동일한 행렬 $ \ 왼쪽 [3 \ Times 5 \ 오른쪽] $와 $ \ 왼쪽 [2 \ times 3 \ right] $ 역순으로 녹화 된 $는 더 이상 동의하지 않습니다. 슬픔. :(

지정된 크기의 사각 행렬 중 $ n $는 직접 및 역순으로 곱할 때 동일한 결과를 제공하도록 항상 찾을 수 있습니다. 모든 유사한 행렬 (및 일반적으로 얼마나 일반적으로)을 설명하는 방법은 별도의 수업을위한 주제입니다. 오늘 우리는 그것에 대해 이야기하지 않을 것입니다. :)

그러나 매트릭스의 곱셈은 연관성입니다.

\ [\ left) \ cdot c = a \ cdot \ left (b \ cdot c \ right) \]

따라서 한 번에 여러 매트릭스를 한 번 행으로 곱해야 할 때, 슬라이드로 수행 할 필요가 있습니다. 가까운 서있는 행렬은 흥미로운 결과를줍니다. 예를 들어, 위에서 설명한 작업 2와 같이 제로 매트릭스가 제로 매트릭스입니다.

실제 작업에서 가장 자주 $ \ 왼쪽 [n \ times n \ right] $의 크기의 정사각형 행렬을 곱해야합니다. 모든 이러한 행렬의 집합은 $ {{m} ^ {n}} $ (즉, 레코드 $ a = \ left [n \ times n \ right] $ 및 \ [\ \ in \ in \ \ \ \ {n}} \]는 동일한 의미)를 의미하며, 반드시 하나씩이라고 불리는 매트릭스 $ e $를 찾을 수 있습니다.

정의. 단일 매트릭스 $ n $의 금액은 모든 사각형 매트릭스 $ a = \ left [n \ times n \ right] $를 평등으로 수행하는 것과 같은 매트릭스 $ e $입니다.

\ [a \ cdot e = e \ cdot a = a \]

이러한 행렬은 항상 똑같이 보입니다. 주 대각선에서 단위, 그리고 다른 모든 셀에서 - 0.

우리는 더 나아 간다. 연관성 외에도 매트릭스의 곱셈도 분산 일뿐입니다.

\ [\ begin {정렬} & a \ cdot \ left (b + c \ right) = a \ cdot b + a \ cdot c; \\ & \ 왼쪽 (a + b \ right) \ cdot c = a \ cdot c + b \ cdot c. \\\ end {정렬} \ \

즉, 다른 두 가지의 합계에 대해 하나의 매트릭스를 곱 해야하는 경우이 "두 명의 다른 것"의 각각에 곱한 다음 결과를 접습니다. 실제로는 반대 작동을 수행해야합니다. 우리는 동일한 매트릭스를 알아야합니다. 우리는 브래킷을 위해 그것을 수행하고, 우리는 추가를 수행하고 따라서 당신의 삶을 단순화합니다. :)

참고 : 전선을 설명하기 위해 두 가지 수식을 등록해야했습니다 : 양은 두 번째 승산기에 있고 양이 첫 번째 부분에있는 곳. 매트릭스의 곱셈이 비 호환이 아니라는 사실로 인해 일어나고 있습니다 (일반적으로 일반 숫자로 일할 때, 심지어 마음에 들지 마십시오). 그리고 그렇다면, 당신은 시험 에이 속성을 쓸 필요가 있다고 말하면, 당신은 확실히 두 수식을 쓸 것이 필요합니다. 그렇지 않으면 교사는 약간 화를 낼 수 있습니다.

좋아,이 모든 것은 정사각형 매트릭스에 관한 동화가있었습니다. 사각형은 어떨까요?

직사각형 매트릭스의 경우

그리고 어떤 것도 정사각형과 동일하지 않습니다.

작업 3. 곱셈을 수행하십시오.

\ [\ left [\ begin {matrix} \ begin {matrix} \ begin {matrix} 5 \\ 2 \\ 3 \\ end {matrix} \ \ begin {matrix} 4 \\ 5 \\ 1 \\\ end {matrix} \ \ \ end {matrix} \ right] \ cdot \ left [\ begin {array} {* {35} {r}} -2 & 5 \\ 3 & 4 \\ end {배열} \ right] \]

해결책. 우리는 두 개의 행렬이 있습니다 : $ a = \ left [3 \ times 2 \ right] $ 및 $ b = \ 왼쪽 [2 \ times 2 \ right] $. 연속 차원을 나타내는 숫자를 마셨다 :

\ [3; \ 2; \ 2; \ 2 \]

보시다시피 중앙 두 숫자가 일치합니다. 따라서 행렬은 동의하고 곱할 수 있습니다. 출력에서 우리는 매트릭스 $ C = \ left [3 \ times 2 \ right] $를 얻습니다.

\ [\ begin {정렬} & \ 왼쪽 [\ begin {matrix} \ begin {matrix} \ begin {matrix} 5 \\ 2 \\ 3 \\ end {matrix} \ begin {matrix} 4 \\ 5 \\ 1 \\ \ end {matrix} \\ end {matrix} \ right] \ cdot \ left [\ begin {array} {* * {35} {r}} -2 & 5 \\ 3 & 4 \\\ end {배열} \ right] = \ left [\ begin {ray} {* {35} {r} {* {35} {}} 5 \ CDOT \ 왼쪽 (-2 \ 오른쪽) +4 \ CDOT 3 & 5 \ CDOT 5 + 4 \ CDOT 4 \\ 2 \ CDOT \ 왼쪽 (-2 \ 오른쪽) +5 \ CDOT 3 & 2 \ CDOT 5 + 5 \ CDOT 4 \\ 3 \ CDOT \ 왼쪽 (-2 \ 오른쪽) +1 \ CDOT 3 & 3 \ CDOT 5 + 1 \ CDOT 4 \\\ end {array \ right] = \\ \ = \ 왼쪽 [\ begin {배열} {* {35} {r}} 2 & 41 \\ 11 & 30 \\ -3 \ 19 \ \\ end { 배열} \ right]. \ end {정렬} \]

모든 것이 깨끗합니다. 3 줄의 최종 행렬과 2 열. 꽤 $ = \ 왼쪽 [3 \ times 2 \ right] $입니다.

답변 : $ \ 왼쪽 [\ begin {rater} {* {35} {* * {35} {} {* {35} {r}} 2 \\ 11 \\ -3 \\\ end {배열} & \ begin {matrix} 41 \\ 30 \\ 19 \\\ end {matrix} \\ end {array} \ right] $.

이제 행렬로 작업을 시작하는 사람들을위한 최고의 훈련 업무 중 하나를 고려하십시오. 그 안에서 두 가지 징후가 단순히 곱하지 않아도 될 필요는 없지만, 그러한 곱셈이 허용되는지 여부를 결정할 필요가 없습니다.

솔루션을 들여다 보지 않으려는 작업을 읽은 후에는 먼저 자신을 수행하려고합니다. 그런 다음 답변과 비교하십시오.

작업 4. 가능한 모든 쌍의 행렬 찾기 :

\ [a = \ left [\ begin {array} {* {35} {r}} \ begin {matrix} 1 \\ 1 \\\ end {matrix} \ begin {배열} {* {35} {r} } -1 \\ 1 \ 'End {Array} \ begin {matrix} 2 \\ 2 \\\ end {matrix} \ begin {배열} {* * {35} {r}}} \\ 2 \\\ end {배열} \\ end {array} \ right] \]; $ b = \ 왼쪽 [\ begin {matrix} \ begin {matrix} 0 \\ 2 \\ 0 \\ 4 \\ end {matrix} \ begin {matrix} 1 \\ 0 \\ 3 \\ 0 \\\ 끝 {matrix} \\\ end {matrix} \ right] $; $ c = \ left [\ begin {matrix} 0 & 1 \\ 1 & 0 \\ end {matrix} \ right] $.

해결책. 시작하려면 행렬의 크기를 작성하십시오.

\ [a = \ left]; \ b = 왼쪽 [4 \ times 2 \ right]; \ c = \ left [2 \ times 2 \ right] \]

$ A $의 열 수가 4이기 때문에 $ B $ 행렬로 $ B $ 행렬만으로 조정할 수 있으며 이러한 수의 행은 $ B $입니다. 따라서 우리는 일을 찾을 수 있습니다 :

\ [a \ cdot b = \ left [\ begin {배열} {* {35} {r}} 1 & 1 & 2 & 2 \\ end {배열} \ 오른쪽] \ cdot \ left [\ begin {array} {* {35} {r}} 0 & 1 \\ 2 & 0 \\ 0 \ 3 \\ 4 & 0 \\ end {배열} \ 오른쪽] = 왼쪽 [\ begin {array} {* * {35} {r}} - 10 & 7 \\ 10 & 7 \\ end {array} \ right] \]

나는 자신의 독자를 실행하기위한 중간 단계를 제안한다. 계산이 발생하기 전에 결과 매트릭스의 크기가 미리 결정하는 것이 좋습니다.

\ [a \ cdot b = \ left [2 \ times 4 \ right] \ cdot \ left [4 \ times 2 \ right] = \ left [2 \ times 2 \ right] \]

즉, 매트릭스의 일관성을 보장하는 "운송"계수를 제거하기 만하면됩니다.

어떤 다른 옵션이 가능합니까? 물론 $ B \ CDOT A $를 찾을 수 있습니다. $ B = \ 왼쪽 [4 \ times 2 \ right] $, $ a = \ left [2 \ times 4 \ right] $이므로 증기 $ \ left (b; \ 오른쪽) $가 일관되며 작업의 차원은 다음과 같습니다.

\ [b \ cdot a = \ left [4 \ times 2 \ right] \ cdot \ left [2 \ times 4 \ right] = \ left [4 \ times 4 \ right] \ \

짧게, 출력에서 ​​$ \ 왼쪽 매트릭스 [4 \ times 4 \ right] $, 그 계수는 쉽게 고려됩니다.

\ [b \ cdot a = \ left [\ begin {ray} {* {35} {r}} 0 & 1 \\ 2 & 0 \\ 0 & 3 \\ 4 & 0 \\ end {배열} \ 오른쪽 ] \ cdot \ left [\ begin {array} {* {35} {r}} 1 & 1 & 2 & 2 \\ end {array \ right] = \ left [\ begin {array} {* {35} { r}} 1 & 3 & 2 & 2 \\ 2 & 3 & 4 & 6 \\ 3 & 3 & 6 & 6 \\ 4 & 3 & 6 \\ 4 & -4 & 8 \\ \\\ end {배열} \ right] \ ...에]

분명히, 당신은 다른 $ C \ CDOT A $ 및 $ B \ CDOT C $ - 그 이유로 동의 할 수 있습니다. 따라서 우리는 획득 된 작품을 단순히 쓸 것입니다 :

\ [c \ cdot a = \ left [\ begin {array} {* {35} {r}} 1 & 1 & 2 & 2 \\ 1 & -1 & 2 & 2 \\\ end {배열} \ 오른쪽] \]

\ [b \ cdot c = \ left [\ begin {배열} {* {35} {r}}} 1 & 0 \\ 0 & 2 \\ 3 & 0 \\ 0 & 4 \\ end {배열} \ 오른쪽 ] \]

쉬웠 어.:)

답변 : $ ab = \ left [\ begin {ray} {* {35} {r}} - 10 & 7 \ 10 & 7 \\\ end {배열} \ right] $; $ ba = \ left [\ begin {array} {* {35} {r}}} 1 & 1 & 2 & 2 \ 2 & 3 & 4 \ 2 & 3 & 6 \\ 2 & 3 & 6 \\ 4 & 3 4 & 8 & 8 \\\ end {array} \ right] $; $ ca = \ left [\ begin {array} {* {35} {r}} 1 & 1 & 2 & 2 \\ 1 & -1 & 2 & 2 \\ end {배열} \ right] $; $ bc = \ left [\ begin {ray} {* {35} \\}} 1 & 0 \\ 0 & 2 \\ 3 & 0 \\ 0 & 4 \\\ end {배열} \ right] $.

일반적으로 나는이 일을 직접 수행하는 것이 좋습니다. 그리고 숙제에있는 또 하나의 비슷한 작업. 이러한 간단한 생각은 매트릭스의 곱셈의 모든 핵심 단계를 해결하는 데 도움이 될 것입니다.

그러나이 이야기에서는 끝나지 않습니다. 곱셈의 특별한 사례로 이동하십시오. :)

벡터 문자열 및 벡터 열입니다

가장 일반적인 매트릭스 작업 중 하나는 한 줄 또는 하나의 열에있는 행렬에서 곱셈입니다.

정의. 벡터 - 열 - 이것은 $ \ left [m \ times 1 \ right] $, 즉, 매트릭스입니다. 여러 줄과 하나의 열만으로 구성됩니다.

벡터 문자열 - 이것은 $ \ left [1 \ times n \ right] $, i.e.의 행렬입니다. 한 행과 여러 열로 구성됩니다.

실제로, 우리는 이미 이러한 물건을 만났습니다. 예를 들어, 입체계 $ \ 왼쪽 (x; y; z \ right) $의 평소 3 차원 벡터는 벡터 문자열이 아닙니다. 행과 열의 차이 이론의 관점에서, 거의 없습니다. 주변 매트릭스 요인에 동의하는 것에주의를 기울여야합니다.

작업 5. 곱셈을 수행하십시오.

\ [\ left [\ begn {array} {* * {35} {R}} 2 & -1 & 3 \\ 4 & 2 & 0 \\ -1 & 1 & 1 \\ end {배열} \ 오른쪽] \ cdot \ left [\ begin {array} {* {35} {r}} 1 \\ 2 \\ -1 \\\ end {배열} \ 오른쪽] \]

해결책. 우리 앞에서 동의 한 행렬의 일 : $ \ 왼쪽 [3 \ times 3 \ right] \ cdot \ left [3 \ times 1 \ right] = \ left [3 \ times 1 \ right] $. 이 작업을 찾으십시오 :

\ [\ left [\ begn {array} {* * {35} {R}} 2 & -1 & 3 \\ 4 & 2 & 0 \\ -1 & 1 & 1 \\ end {배열} \ 오른쪽] \ CDOT \ LEFT [\ begin {array} {* {35} \\\ end {array} \ right] = \ left [\ begin {array} {* {35} {R}} 2 \ CDOT 1+ \ 왼쪽 (-1 \ 오른쪽) \ CDOT 2 + 3 \ CDOT \ 왼쪽 (-1 \ 오른쪽) \\ 4 \ CDOT 1 + 2 \ CDOT 2 + 0 \ CDOT 2 \ \ 1 \ CDOT 1 + 1 \ CDOT 2 + 1 \ CDOT \ 왼쪽 (-1 \ 오른쪽) \\\ end {array} \ right] = \ left [\ begin {array} {* {35} {r}} - 3 \\ 8 \\ 0 \\ end {배열} \ right] \]

답변 : $ \ 왼쪽 [\ begin {ray} {* {35} {}} - 3 \\ 8 \\ 0 \\\ end {array} \ right] $.

작업 6. 곱셈을 수행하십시오.

\ [\ left [\ begin {array} {* {35} {r} {* {35}}} 1 & 2 \ 오른쪽] \ cdot \ left [\ begin {array} {* {35} {R} } 3 & 1 & 1 \\ 4 & -1 & 3 \\ 2 & 6 & 0 \\ end {배열} \ 오른쪽] \

해결책. 다시 말하지만 $ \ left [1 \ times 3 \ right] \ cdot \ left [3 \ times 3 \ right] = \ left [1 \ times 3 \ right] $. 우리는 그 일을 고려합니다.

\ [\ left [\ begin {array} {* {35} {r} {* {35}}} 1 & 2 \ 오른쪽] \ cdot \ left [\ begin {array} {* {35} {R} } 3 & 1 및 -1 \\ 4 & -1 & 3 \\ 2 & 6 & 0 \\ end {array} \ right] = \ left [\ begin {array} {* {35} {r}}} 5 & -19 & 5 \\ end {배열} \ 오른쪽] \]

사실, 나는이 세 가지 숫자가 스크랩 횟수에있었습니다. 그리고 나는 그냥 대답을 적어 라. :)

답변 : $ \ 왼쪽 [\ begin {matrix} 5 & -19 & 5 \\\ end {matrix} \ right] $.

보시다시피 벡터 문자열과 출력에서 ​​정사각형 매트릭스의 벡터 열을 곱하면 항상 동일한 크기의 문자열 또는 열을 가져옵니다. 이 사실은 선형 방정식을 모든 종류의 좌표 변환 (결과적으로 방정식 시스템을 줄이는 것도 줄어든서, 그러나 슬프지 않아도됩니다.

나는 모든 것이 여기에 명백하다고 생각한다. 오늘의 교훈의 마지막 부분으로 이동하십시오.

매트릭스 건설 학위

모든 작업 중에는 특정 관심을 곱한 것 중에도 학위로 제기됩니다. 이것은 우리가 동일한 물체를 여러 번 곱할 때입니다. 행렬은 예외는 아닙니다. 또한 다양한 학위로 세워질 수 있습니다.

이러한 작품은 항상 합의됩니다.

\ [a \ cdot a = \ left [n \ times n \ right] \ cdot \ left [n \ times n \ right] = \ left [n \ times n \ right] \]

평소와 정확히 동일한 것을 나타냅니다.

\ [\ begin {정렬} & a \ cdot a = {{a} ^ {2}}; \\ & a \ cdot a \ cdot a = {{a} ^ {3}}; \\ & \ undrebrace {a \ cdot a \ cdot \ ldots \ cdot a} _ {n} = {{a} ^ {n}}. \\ \ end {정렬} \ \

처음에는 모든 것이 간단합니다. 실제로 어떻게 보이는지 보자.

작업 7. 매트릭스를 지정된 정도로 Eduge에 edUge 에드로드합니다.

$ {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {3}} $

해결책. 글쎄, 직립합시다. 첫째, 사각형으로 지나쳐 라.

\ [\ begin {Align} {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {2}} = \ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right] \ cdot \ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right] = \\ \ \ left [ \ begin {배열} {* {35} {* * {35} \ CDOT 0 \ CDOT 1 + 1 + 1 \ CDOT 1 \\ 0 \ CDOT 1 + 1 \ CDOT 0 & 0 \ CDOT 1 + 1 \ CDOT 1 \\\ end {array} \ right] = \\ \ = \ left [\ begin {array} {* {35} {r}} 1 & 2 \\ 0 & 1 \ \\ end {배열 } \ 오른쪽] \ end {정렬} \

\ [\ begin {Align} {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {3}} = {{\ left [\ begin {matrix } 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {3}} \ cdot \ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\\ end {matrix} \ = \\ \ \ \ 왼쪽 [\ begin {ray} {* {35} {r}}} 1 & 2 \\ 0 & 1 \\ end {배열} \ 오른쪽] \ cdot \ left [\ begin {matrix } 1 & 1 \\ 0 & 1 \\ end {matrix} \ right] = \\ \ = \ 왼쪽 [\ begin {배열} {* {35} {r}} 1 & 3 \\ 0 & 1 \\ 끝 {Array} \ right] \ end {정렬} \ \

그게 다야.:)

답변 : $ \ 왼쪽 [\ begin {matrix} 1 & 3 \\ 0 & 1 \\ end {matrix} \ right] $.

작업 8. 매트릭스를 지정된 정도로 eduge에 eduge :

\ [{{\ left [\ begin {matrix} 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {10}} \]

해결책. 그러나 "학위가 너무 큽니다"라는 사실에서 울어야 할 필요가 없습니다. "세상은 공정하지 않으며"완전히 잃어버린 가르침 ". 실제로 모든 것이 쉽습니다.

\ [\ begin {Align} {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {10}} = {{\ \ left [\ begin {matrix } 1 & 1 \\ 0 & 1 \\ end {matrix} \ right]} ^ {3}} \ cdot {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\\ end {matrix } \ {3}} \ CDOT {{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right}} ^ {3}} \ cdot \ left [ \ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right] = \\ & = \ 왼쪽 (\ left [\ begin {matrix} 1 & 3 \\ 0 & 1 \\\ end {matrix} \ right] \ cdot \ left [\ begin {matrix} 1 & 3 \\ 0 & 1 \\ end {matrix} \ right] \ 오른쪽) \ cdot \ 왼쪽 (\ left [\ begin {matrix} 1 & 3 \\ 0 & 1 \\ end {matrix} \ right] \ cdot \ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \ right] \ right) = \\ \ = \ left [\ begin {matrix} 1 & 6 \\ 0 & 1 \\ end {matrix} \ right] \ cdot \ left [\ begin {matrix} 1 & 4 \\ 0 & 1 \\ end {matrix} \ right] = \\ & = \ left [\ begin {matrix} 1 & 10 \\ 0 & 1 \\ end {matrix} \ right] \ end {정렬} \ \

참고 : 두 번째 줄에서는 곱셈 연관성을 사용했습니다. 사실, 우리는 이전의 작업에서 그것을 사용했지만, 암시 적으로 사용되었습니다.

답변 : $ \ 왼쪽 [\ begin {matrix} 1 & 10 \\ 0 & 1 \\ end {matrix} \ right] $.

보시다시피, 매트릭스의 구조가 정도로 복잡하지는 않습니다. 마지막 예제는 일반화 될 수 있습니다.

\ [{\ left [\ begin {matrix} 1 & 1 \\ 0 & 1 \\ end {matrix} \\ end {matrix} \ reign]} ^ {n}} = \ left [\ begin {array} {* {35} { r}} 1 & n \\ 0 & 1 \\ end {배열} \ 오른쪽] \]

이 사실은 수학적 유도 또는 직접 곱셈을 통해 쉽게 증명할 수 있습니다. 그러나 항상 정도가 그러한 패턴에 의해 잡힐 수있는 것은 아닙니다. 그러므로 세심성이 있습니다. 종종 여러 매트릭스 "스트로이"가 정규 패턴을 찾는 것보다 쉽고 빠르게 늘어납니다.

일반적으로 가장 높은 의미를 찾지 마십시오. 결론적으로 더 큰 매트릭스의 구조를 고려하십시오. optionalwittilitify $ \ left [3 \ times 3 \ right] $.

작업 9. 매트릭스를 지정된 정도로 Eduge :

\ [{{\ left [\ begin {Matrix} 0 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right}} ^ {3}} \ \]

해결책. 규칙 성을 찾지 못할 것입니다. 우리는 "스트로이"를 일합니다.

\ [{{\ left [\ begin {matrix} 0 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right]} ^ {3}} = {{\ [\ Begin {Matrix} 0 & 1 & 1 \ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right]} ^ {2}} \ cdot \ left [\ begin {matrix } 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right] \]

시작하려면이 매트릭스를 사각형으로 직립하십시오.

\ [\ begin {Align} {{\ left [\ begin {matrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right]} ^ {2} } = \ left [\ begin {matrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right] \ cdot \ left [\ begin {matrix} 0 & 1 \ 1 \ 1 및 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right] = \\ & = \ 왼쪽 [\ begin {배열} {* {35} {r}}} 2 & 1 & 1 \\ 1 & 2 & 1 \\ 1 & 1 & 2 \\ end {배열} \ 오른쪽] \ end {정렬} \ \]

이제 큐브로 세워졌습니다.

\ [\ begin {정렬} {{\ left [\ begin {matrix} 0 & 1 & 1 \\ 1 & 0 & 1 \\ 1 & 1 & 0 \\ end {matrix} \ right]} ^ {3} } = \ left [\ begin {ray} {* {35} {R}} 2 & 1 & 1 \ 1 & 2 & 1 \ 1 & 2 \\ end {배열} \ 오른쪽] \ cdot \ [\ Begin {Matrix} 0 & 1 & 1 & 0 \\ \ 1 & 1 & 0 \\ end {matrix} \ right] = \\ & = \ 왼쪽 [\ begin {array} {* {35} {r}} 2 & 3 & 3 \\ 3 & 2 \\ \ 3 & 3 & 2 \\ end {배열} \ 오른쪽] \ end {정렬} \ \

그게 다야. 작업이 해결됩니다.

답변 : $ \ 왼쪽 [\ begin {matrix} 2 & 3 & 3 \ 2 & 2 & 3 \ 2 & 3 & 2 \\ end {matrix} \ right] $.

알 수 있듯이 컴퓨팅의 양이 더 많아 지지만이 의미는 이것으로 바뀌지 않았습니다. :)

이 수업에서는 완료 될 수 있습니다. 다음 번에 우리가 역 작업을 살펴볼 때 : 기존 작업에 따르면 원래의 요인을 찾습니다.

이미 짐작할 수 있듯이, 그것은 반환 매트릭스와 그 위치의 방법에 관한 것입니다.

또한보십시오:

  1. 결정자
  2. 역 매트릭스
  3. 평가판 EGE-2011 수학, 옵션 번호 8
  4. 서클의 면적
  5. 로그인을 더 빨리 계산하는 방법
  6. Task 13 : Trigonometry.

행렬로 행동

이 방법 론적 매뉴얼은 당신이 수행하는 법을 배우는 데 도움이됩니다 행렬로 행동 : 매트릭스의 첨가 (빼기), 이동 매트릭스, 행렬의 곱셈, 역 매트릭스를 찾는 행렬을 찾습니다. 모든 물질은 간단하고 접근 할 수있는 형태로 제공되며 적절한 예제가 주어 지므로 준비가되지 않은 사람조차 행렬로 조치를 수행하는 법을 배울 수 있습니다.

자제 및 자체 테스트의 경우 매트릭스 계산기를 무료로 다운로드 할 수 있습니다. >>> 일부는 이론적 계산을 최소화하려고 노력할 것입니다. 일부 지역에서는 "손가락에"설명과 비 과학적 용어의 사용을 시도 할 것입니다. 단단한 이론의 연인, 비판하지 마십시오, 우리의 임무는 .

행렬로 행동을 수행하는 법을 배웁니다 주제에 대한 초고속 준비 (누가 "불타는")는 강렬한 PDF 과정이 있습니다.

매트릭스, 결정 요인 및 서!

시작하자. 매트릭스는 모든 직사각형 테이블입니다 집단 매트릭스는 모든 직사각형 테이블입니다 ...에 NS 우리는 숫자, 즉 수치 매트릭스를 고려할 것입니다. 요소

- 이것은 용어입니다. 이 용어는 기억하는 것이 좋습니다, 종종 만날 것입니다, 그것은 뚱뚱한 글꼴을 사용하여 강조 표시하는 것이 아닙니다. 지정:

매트릭스는 대개 자본 라틴 문자로 나타냅니다 예:

"두 세"매트릭스를 고려하십시오. 매트릭스는 모든 직사각형 테이블입니다 :이 매트릭스는 6으로 구성됩니다 매트릭스 내부의 모든 숫자 (요소)는 스스로 존재합니다. 즉, 연설의 공제가 없습니다.

그것은 단지 테이블 (세트) 숫자입니다! 동의하다 다시 정리하지 마십시오

별도로 언급하지 않는 한 숫자. 각 숫자는 자체 위치를 가지고 있으며 꺼낼 수 없습니다! 고려중인 매트릭스에는 두 줄이 있습니다.

및 세 개의 열 : 기준 : 그들이 매트릭스의 크기에 대해 이야기 할 때, 처음에는

행 수를 나타내고, 그런 다음 열 수를 나타냅니다. 우리는 단지 "두 세"매트릭스의 뼈를 분해했습니다. 행렬의 행과 열 수가 일치하는 경우 행렬이 호출됩니다. 정사각형 , 예를 들어:

- 매트릭스 "3 3". 매트릭스 한 컬럼에있는 경우 또는 한 줄 그런 다음 이러한 행렬도 호출됩니다 .

벡터 사실, 매트릭스의 개념은 학교 이후 "X"좌표와 "igrek"가있는 지점을 고려해보십시오. ...에 본질적으로, 포인트의 좌표  и "1-2"행렬에 잠겨 있습니다. 그건 그렇고, 여기서 예제가 중요한 이유는 무엇입니까?

- 이들은 평면의 완전히 다른 두 가지입니다. 이제 연구에 직접 가십시오 :

매트릭스가있는 작업 .

1) 첫 번째 행동. 매트릭스에서 마이너스에 도달 (매트릭스에서 마이너스 만들기) 우리의 매트릭스로 돌아갑니다

...에 당신이 알아 차리면서이 행렬에는 너무 많은 음수가 있습니다. 매트릭스를 사용하여 다양한 작업을 수행하는 측면에서 매우 불편하며, 많은 짐을 쓸수록 불편하며, 단지 설계에서 추한 것처럼 보입니다. :나는 매트릭스를 넘어서 마이너스를 만들어 매트릭스 표지의 각 요소를 변경합니다.

Ulya, 당신이 이해할 때, 표지판은 변하지 않고, 0 - 그와 아프리카가 0입니다. 사료 예제 :

...에 추악 해 보인다. :

우리는 매트릭스에서 마이너스를 만들어 각 요소의 매트릭스를 변경합니다. 글쎄, 그것은 훨씬 더 예쁘게 밝혀졌습니다. 그리고 가장 중요한 것은 매트릭스를 사용하여 모든 작업을 수행합니다. 그런 수학적 민속 기호가 있기 때문에 : .

더 많은 혼란과 실수가 더 많이 있습니다 2) .

매트릭스는 대개 자본 라틴 문자로 나타냅니다

행동 두 번째. 매트릭스의 곱셈 ​​번호 모든 것이 매트릭스에 매트릭스를 곱하기 위해 간단합니다. 여러분

매트릭스 요소는 주어진 숫자에 곱합니다. 이 경우 상위 3 개에서.

또 다른 유용한 예 :

- 분수에 대한 매트릭스의 곱셈 먼저해야 할 일을 고려하십시오 :필요 없음 매트릭스를 입력 할 필요가 없으므로 매트릭스로 더 이상의 조치만이 어려워 지므로, 둘째로, 교사의 결정을 확인하기가 어렵습니다 (특히

- 최종 답변 답변). 먼저해야 할 일을 고려하십시오 특히,

MATRIX의 각 요소를 마이너스 7에 공유하십시오. 기사에서 인형을위한 수학 또는 시작 시작

우리는 더 높은 수학에서 쉼표가있는 십진 분수가 모든면을 피하려고 노력하고 있습니다. 유일한 것 바람직한

이 예제에서 make - matrix에서 마이너스를 만들려면 다음을 수행하십시오. 그러나 만약 모두 매트릭스의 요소들은 7로 나누었다 잔류 물없이

매트릭스는 대개 자본 라틴 문자로 나타냅니다

그런 다음 (그리고 당신이 필요로합니다!) 그것은 나누어 질 것입니다. 이 경우, 당신은 할 수 있습니다 필요한 매트릭스의 모든 요소를 ​​곱하십시오 행렬의 모든 숫자는 2로 나뉩니다. .

잔류 물없이

참고 : 더 높은 수학 이론에서 학교 개념 "부서"는 그렇지 않습니다. "이것이 나누어집니다"라는 문구 대신 항상 "분수로 곱하기"라고 말할 수 있습니다. 즉, 부서는 곱셈의 특별한 경우입니다. .

3) 세 번째 행동. 매트릭스를 바꾸는 것

매트릭스는 대개 자본 라틴 문자로 나타냅니다

매트릭스를 이동하려면 변속 매트릭스의 열에 라인을 쓸 필요가 있습니다.

조옮김 매트릭스

여기의 라인은 하나만뿐입니다. 규칙에 따르면 열에 기록되어야합니다.

- 전치 매트릭스. 전치 매트릭스는 대개 급격한 색인으로 표시됩니다.

위의 오른쪽에 닿으십시오.

매트릭스를 이동하려면 변속 매트릭스의 열에 라인을 쓸 필요가 있습니다.

단계별 단계별 단계 :

먼저 첫 번째 열로 첫 번째 문자열을 다시 작성하십시오.

그런 다음 두 번째 열에서 두 번째 문자열을 다시 작성하십시오.

마지막으로 세 번째 열에서 세 번째 문자열을 다시 작성하십시오.

준비가 된. 비 유적으로 말하면, 전치 - 그것은 오른쪽 상단 모서리에 대한 매트릭스를 가져 와서 대각선으로 "자신을 흔들어"숫자를 변형 된 매트릭스의 열로 "흔들립니다"라는 것을 의미합니다. 여기서 나는 협회가있다. .

4) 네 번째 행동. 금액 (차이) 매트릭스

행렬 조치의 양은 간단합니다.

매트릭스는 대개 자본 라틴 문자로 나타냅니다

모든 행렬을 접을 수있는 것은 아닙니다. 행렬의 첨가를 수행하기 위해서는 크기가 동일한 것과 동일해야합니다.  и

예를 들어, "2 ~ 2"매트릭스가 주어지면 "두 개의 두"행렬과 다른 다른 것만으로 접혀있을 수 있습니다! :

행렬을 접어 라 매트릭스를 접 으려면 해당 요소를 접을 필요가 있습니다. .

매트릭스는 대개 자본 라틴 문자로 나타냅니다

매트릭스의 차이를 위해 규칙은 유사합니다. ,

해당 요소의 차이를 찾아야합니다. :

 

차이 매트릭스를 찾으십시오

이 예제를 해결하는 방법은 혼란스러워하지 않는 것이 더 쉽습니다. 여분의 마이너스를 제거하는 것이 좋습니다.이를 위해 우리는 매트릭스에서 마이너스를 만들 것입니다. .

참고 : 더 높은 수학 이론에서 학교 개념 "뺄셈"이 아닙니다. "이것의 문구 대신"음수를 추가하는 것이 항상 "할 수 있습니다." 즉, 뺄셈은 특별한 경우의 특별한 경우입니다.

5) 다섯 번째 행동. 매트릭스 곱셈

포리스트의 더 멀리, 두꺼운 당파. 나는 즉시 말할 것입니다. 행렬의 곱셈의 규칙은 매우 이상하게 보입니다. 그러나 설명하기가 너무 간단하지는 않지만, 여전히 특정 예를 사용 하여이 작업을 수행하려고합니다. 어떤 매트릭스를 곱할 수 있습니까? 매트릭스에 매트릭스가 곱해질 수 있습니다 필요한, .

매트릭스의 열 수까지 매트릭스의 행 수와 같습니다 예: ?

매트릭스를 곱할 수 있습니까?

매트릭스에

따라서 매트릭스의 데이터가 곱할 수 있습니다.

그러나 매트릭스가 장소에서 재배치되면이 경우 곱셈이 더 이상 가능하지 않습니다!

따라서 곱셈은 불가능합니다.  и 드물게하지 않으므로 학생이 매트릭스를 곱하기 위해 학생이 제안 될 때, 곱셈은 분명히 불가능합니다. 어떤 경우에는 매트릭스를 곱할 수 있으므로 그렇게 할 수 있습니다.

예를 들어, 매트릭스의 경우,

아마도 곱셈 방식이 될 것입니다

및 곱셈

매트릭스는 대개 자본 라틴 문자로 나타냅니다

매트릭스를 곱하는 방법? 예: 엄격한 정의가 대부분의 독자들을 혼동 (또는 불량) 혼동시킬 것이기 때문에 행렬의 곱셈은 특정 예제에서 더 잘 설명됩니다.

가장 단순한 것으로 시작합시다 :

매트릭스를 곱하십시오

매트릭스를 곱하는 방법? 예:

나는 각각의 경우에 즉시 공식을 주겠다.

- 즉시 패턴을 잡으십시오.

예제가 더 어려워집니다. 공식: 그 결과, 소위 제로 매트릭스가 얻어진다.

곱셈을 수행하십시오 (정답

짐마자 그건 주목하라

...에! 거의 항상 그렇게! 예: 따라서,

매트릭스를 곱하면 재정렬 할 수 없습니다!

매트릭스를 곱하는 방법? 예:

작업이 매트릭스를 곱하기 위해 제안 된 경우

,이 순서를 곱해야합니다. 반대로 절대로 절대로 절대로.

3 차 행렬로 이동하십시오. 예:

수식은 이전 수식과 매우 유사합니다.

이제 다음 행렬의 곱셈에서 알아 봅니다. .

매트릭스를 곱하십시오

여기에 기성한 솔루션이 있지만 먼저 그것을 보지 않으려 고 노력하십시오!

6) 여섯 번째 행동. 반환 매트릭스 찾기

이 주제는 매우 광범위 하며이 항목을 별도의 페이지에서 만들었습니다.

그 동안 성능이 완료됩니다.

 매트릭스 곱셈의 알고리즘을 사용하면 현대 프로세서의 자원을 효과적으로 사용할 수 있습니다. 그러나 현대 프로세서의 자원의 최대 활용도가 아닌 업무에서 멀리 떨어져 있음을 분명히 보여줍니다. 프로세서 캐시에서 Microerler와 최대 데이터 로컬라이제이션을 사용하는 방법은 다른 알고리즘에 대해 성공적으로 사용될 수 있습니다.

엔트리 레벨을 마스터 한 후 Matrices에서 작업 속성의 공과에서 행렬로 작업하는 것이 좋습니다. 매트릭스 표현식.

행운을 빌어 요!

게시자 : Emelin Alexander.

이상이 아니라 가장 높은 수학이 아니라 >>>

(기본 페이지로 이동)

저자에게 어떻게 감사 할 수 있습니까?

"모든 것이 전달되었습니다!" - 학생들에게 온라인 서비스 지원

소개

매트릭스의 곱셈은 다양한 수치 방법 및 특히 기계 학습 알고리즘에서 널리 사용되는 기본 알고리즘 중 하나입니다. 계층 네트워크의 컨벌루션 계층에서 직접 및 역 신호 전파의 많은 구현은이 작업을 기반으로합니다. 때로는 기계 학습에 소요되는 총 시간의 90-95 %까지이 작업을 수행합니다. 왜이 일이 일어나고 있는가? 이 답변은 프로세서, 그래픽 가속기 (최근에는 매트릭스 곱셈의 특별한 가속기)에 대한이 알고리즘의 매우 효과적인 구현에 있습니다. 매트릭스 곱셈은 현대 프로세서 및 그래픽 가속기의 모든 계산 자원을 효과적으로 사용할 수있는 몇 가지 알고리즘 중 하나입니다. 따라서 많은 알고리즘이 매트릭스 곱셈으로 감소하려고하는 것은 놀라운 일이 아닙니다. 데이터 준비와 관련된 추가 비용은 일반적으로 알고리즘의 전체 가속에 의해 정확하게 지불됩니다.

매트릭스 곱셈의 알고리즘은 어떻게됩니까? 이제는 오픈 소스 코드를 포함 하여이 알고리즘의 많은 구현이 많이 있습니다. 그러나 불행히도이 구현의 코드 (대부분 어셈블러에서)는 매우 복잡합니다. 좋은 영어 기사가 있습니다.

이 알고리즘을 자세히 설명합니다. 놀랍게도, 나는 아브레에 대한 아날로그를 찾지 못했습니다. 나와 같이,이 이유는 자체 기사를 쓸만큼 충분합니다. 프레젠테이션의 양을 제한하기 위해, 나는 종래의 프로세서에 대한 단일 스레드 알고리즘에 대한 설명을 제한한다. 그래픽 가속기에 대한 멀티 스레딩 및 알고리즘의 주제는 별도의 기사를 명확하게 할 수 있습니다.

프리젠 테이션 과정은 알고리즘의 일관된 가속에 관한 예를 들어 VVID 단계로 수행됩니다. 나는 가장 단순화 된 작업을 작성하려고 노력했지만 더 이상은 아닙니다. 나는 내가 희망했다. 

문제 명세서 (0 단계) A일반적으로 매트릭스 곱셈 기능은 다음과 같이 설명됩니다. BC [i, j] = A * C [I, J] + B * 합 (A [i, k] * b [k, j]); C매트릭스가있는 곳입니다

그것은 크기 m x k, matrix입니다

- k x n, matrix. 

- M x N.

우리는 프레젠테이션에 대한 편견이 없으며, 우리는 A = 0과 b = 1을 가정 할 수 있습니다. 

C [i, j] = 합 (A [I, K] * B [k, j]);

공식의 C ++ "C ++"에 대한 구현은 다음과 같습니다.

void gemm_v0 (int m, int n, int k, const float * a, const float * b, float * c) {for (int i = 0, i <m; ++ i) {int j = 0; J <n; ++ j) {C [I * N + J] = 0; (int k = 0; k <k; + k) C [I * N + J] + = A [i * k + k] * b [k * n + j]; }}}

  1. 그녀의 생산성을 기대하는 것은 어리 석고 실제로 테스트 측정치는 (m = n = k = 1152) 거의 1.8 초 (테스트 기계 - [email protected], OS - 우분투 16.04.6 LTS) , 컴파일러 - G ++ - 6.5.0b 컴파일러 옵션 - "-fpic -o3 -march = haswell"). 매트릭스 곱셈을위한 최소 연산 수는 2 * m * n * k = 2 * 10 ^ 9입니다. 그패서, 성능은이 프로세서의 단일 스레드 성능의 이론적 인 한계 (~ 120 gflops (플로트 -22) AVX-512를 사용할 때 ~ 200 gflops를 사용하는 경우 매우 멀리 떨어져있는 1.6 gflops입니다. ...에 이론적 한계에 더 가까이 가기 위해 취해야하는 것은 무엇입니까? 다음으로, 연속적인 최적화의 과정에서 우리는 많은 표준 라이브러리에서 사용되는 것을 크게 재생하는 솔루션에 올 것입니다. 최적화 과정에서 나는 절단이 여전히 작기 때문에 AVX-512 AVX-512만을 사용하지 않을 것입니다.
  2. 명백한 단점 제거 (1 단계) B먼저 알고리즘의 가장 분명한 결함을 제거하십시오.
배열의 요소의 주소의 계산은 단순화 될 수 있습니다 - 내부 주기로 영구적 인 부분을 만듭니다. 

원래 버전에서 배열의 요소에 대한 액세스

그것은 순차적으로 아닙니다. 내부주기가 세 가지 행렬 모두에 대한 라인에 의해 순차적 인 우회로가되는 방식으로 계산 순서를 변경하면 간소화 될 수 있습니다.

void gemm_v1 (int m, int n, int k, const float * a, const float * b, float * c) {for (int i = 0; i <m; ++ i) {float * c = c + i * NS; for (int j = 0; j <n; ++ j) c [j] = 0; (int k = 0; k <k; + k) {const float * b = b + k * n; 플로트 A = a [i * k + k]; for (int j = 0; j <n; ++ j) C [j] + = a * b [j]; }}}

테스트 측정 결과는 250ms 또는 11.4 GFLOPS의 실행 시간을 보여줍니다. 저것들. 우리는 그런 작은 편집으로 가속 8 번을 얻었습니다! 

내부주기를 벡터화 (2 단계)

  1. 내부주기를주의 깊게 보면 (가변 J에 따라) 계산을 블록 (벡터)으로 수행 할 수 있음을 알 수 있습니다. 거의 모든 현대 프로세서가 그러한 벡터를 통해 계산을 허용합니다. 특히 AVX 명령어 세트는 256 비트의 벡터로 작동합니다. 이는 전술에 대한 단일 정확도가있는 실수로 8 개의 작업을 수행 할 수 있습니다. AVX2 / FMA는 한 단계 앞으로 나아갔습니다. 곱하기 및 첨가 (D = A * B + C)의 융합 작동을 수행 할 수 있습니다. 4 세대에서 시작하는 인텔 데스크탑 프로세서는 2 개의 256 비트 FMA 모듈을 가지고 있으며, 이로 인해 이론적으로 2 * 2 * 8 = 32 조작 (FLOAT-32)을 택트 당 2 * 2 * 8 = 32 연산 (14)으로 수행 할 수 있습니다. 다행히도 AVX2 / FMA 명령어는 임베디드 기능을 사용하여 C / C ++에서 직접 사용하기가 쉽습니다 (Intrinsics). AVX2 / FMA의 경우 헤더 파일 <Immintrin.h>에서 선언됩니다.
  2. void gemm_v2 (int m, int n, int k, const float * a, const float * b, float * c) {for (int i = 0; i <m; ++ i) {float * c = c + i * NS; (int j = 0; j <n; j + = 8) _MM256_STOREU_PS (C + J + 0, _MM256_SETZERE_PS ()); (int k = 0; k <k; + k) {const float * b = b + k * n; __m256_set1_ps (a [i * k + k]); (int j = 0; j <n; j + = 16) {_mm256_storeu_ps (C + J + 0, _MM256_FMADD_PS (a, _mm256_loadu_ps (b + j + 0), _mm256_loadu_ps (c + j + 0)); _MM256_STOREU_PS (C + J + 8, _MM256_FMADD_PS (A, _MM256_LOADU_PS (B + J + 8), _MM256_LOADU_PS (C + J + 8)); }}}}

테스트를 실행하고, 217ms 또는 13.1 gflops의 시간을 얻으십시오. 죄송합니다! 가속도는 15 %에 불과합니다. How dore young 여기서 두 가지 요소를 고려해야합니다.

컴파일러는 이제 똑똑하게 (모두가 아닙니다!), 간단한주기의 자체화 작업에 완전히 대응합니다. 이미 첫 번째 버전에있는 컴파일러는 수동 최적화가 우리에게 거의 어떤 이점을주지 않았기 때문에 컴파일러가 실제로 AVX2 / FMA 지침과 관련이 있습니다.

이 경우 계산 속도는 프로세서의 계산 기능이 아니라 다운로드 속도 및 데이터의 방전에서 달려 있습니다. 이 경우 2 개의 256 비트 FMA 블록의 활성화를위한 프로세서는 4를 다운로드하고 TACT 당 2 개의 256 비트 벡터를 언로드해야합니다. 이것은 프로세서 캐시 (512/256 비트)의 대역폭 L1조차도 2 배, 메모리 대역폭 (채널 당 64 비트) 인 메모리 대역폭을 언급하지는 않습니다.).

따라서 현대 프로세서의 제한된 메모리 대역폭의 주요 문제점이 있습니다. 프로세서는 실제로 데이터가로드되어 메모리에 저장 될 때가 기대되는 시간의 90 %를 유발합니다.

알고리즘을 최적화하는 추가 단계는 메모리 액세스를 최소화하기위한 것입니다. С우리는 마이크로커 (3 단계)를 씁니다. С이전 버전에서는 2 개의 다운로드 및 1 개의 언 로딩을위한 FMA 작업을 1 개의 FMA 작업을 수행합니다. A и B모든 다운로드 및 언로드의 대부분은 결과 매트릭스와 함께 발생합니다.

: 다운로드 해야하는 데이터가 필요합니다. C [i] [j] + = a [i] [k] * b [k] [j]를 추가 한 다음 저장하십시오. 그리고 너무나 여러 번. 프로세서가 작동 할 수있는 가장 빠른 메모리는 자체 레지스터입니다. 우리가 결과 매트릭스 값을 유지하면 B.

프로세서 레지스터에서 계산 중에는 매트릭스 값만로드해야합니다. С...에 이제 우리는 1 개의 FMA 운영 계좌가 2 개의 다운로드에 불과합니다.

매트릭스 C [i] [j] 및 c [i] [j + 1]의 두 개의 인접한 열 값을 저장하면 매트릭스 A [i] [k]의로드 된 값을 재사용 할 수 있습니다. 1 개의 FMA 작동은 1.5 다운로드 만 필요합니다. 또한 2 개의 독립 레지스터에서 결과를 유지하면서 프로세서가 TACT에 대해 2 개의 FMA 작업을 수행 할 수 있습니다. 마찬가지로 레지스터에 두 개의 인접한 줄의 값을 저장할 수 있습니다. 그런 다음 저장소가 매트릭스 값을로드하는 데 절약됩니다. С2 세대부터 시작하는 총 Intel 데스크탑 프로세서에는 16,256 비트 벡터 레지스터가 있습니다 (64 비트 프로세서 모드에서 유효). 그 중 12 개는 결과 매트릭스를 저장하는 데 사용할 수 있습니다.

6x16 크기. 결과적으로 메모리에서 16 + 6 = 22 값만 다운로드하여 12 * 8 = 96 FMA 작업을 수행 할 수 있습니다. 우리는 2.0에서 0.23 다운로드까지 메모리 액세스를 줄이었습니다. 1 FMA 작동 - 거의 10 번! 

매트릭스의 작은 조각의 계산을 수행하는 기능 С:

일반적으로 마이크로 니어라고도하는 다음 기능의 예입니다. 

void micro_6x16 (int k, const float * a, int lda, int step, const float * b, int ldb, float * c, int ldc) {__m256 c00 = _mm256_setzero_ps (); __M256 C10 = _MM256_SETZERO_PS (); __m256 C20 = _mm256_setzero_ps (); __m256 C30 = _mm256_setzero_ps (); __m256 C40 = _mm256_setzero_ps (); __m256 C50 = _mm256_setzero_ps (); __m256 C01 = _mm256_setzero_ps (); __m256 C11 = _mm256_setzero_ps (); __m256 C21 = _mm256_setzero_ps (); __m256 C31 = _mm256_setzero_ps (); __m256 C41 = _mm256_setzero_ps (); __m256 C51 = _mm256_setzero_ps (); const int offset0 = lda * 0; const int offset1 = lda * 1; const int offset2 = lda * 2; const int offset3 = lda * 3; const int offset4 = lda * 4; const int offset5 = lda * 5; __m256 B0, B1, A0, A1; (int k = 0; k <k; k ++) {b0 = _mm256_loadu_ps (b + 0); B1 = _MM256_LOADU_PS (B + 8); A0 = _mm256_set1_ps (a [offset0]); a1 = _mm256_set1_ps (a [offset1]); C00 = _MM256_FMADD_PS (A0, B0, C00); C01 = _MM256_FMADD_PS (A0, B1, C01); C10 = _MM256_FADDD_PS (A1, B0, C10); C11 = _MM256_FADDD_PS (A1, B1, C11); a0 = _mm256_set1_ps (a [offset2]); a1 = _mm256_set1_ps (a [offset3]); C20 = _MM256_FADD_PS (A0, B0, C20); C21 = _MM256_FMADD_PS (A0, B1, C21); C30 = _MM256_FMADDD_PS (A1, B0, C30); C31 = _MM256_FMADDD_PS (A1, B1, C31); a0 = _mm256_set1_ps (a [offset4]); a1 = _mm256_set1_ps (a [offset5]); C40 = _MM256_FADDD_PS (A0, B0, C40); C41 = _MM256_FMADDD_PS (A0, B1, C41); C50 = _MM256_FMADD_PS (A1, B0, C50); C51 = _MM256_FMADD_PS (A1, B1, C51); B + = LDB; A + = 단계; } _mm256_storeu_ps (C + 0, _MM256_ADD_PS (C00, _MM256_LOADU_PS (C + 0))); _mm256_storeu_ps (C + 8, _MM256_ADD_PS (C01, _MM256_LOADU_PS (C + 8)); C + = LDC; _mm256_storeu_ps (C + 0, _MM256_ADD_PS (C10, _MM256_LOADU_PS (C + 0)); _MM256_STOREU_PS (C + 8, _MM256_ADD_PS (C11, _MM256_LOADU_PS (C + 8))); C + = LDC; _mm256_storeu_ps (C + 0, _MM256_ADD_PS (C20, _MM256_LOADU_PS (C + 0)); _mm256_storeu_ps (C + 8, _MM256_ADD_PS (C21, _MM256_LOADU_PS (C + 8)); C + = LDC; _MM256_STOREU_PS (C + 0, _MM256_ADD_PS (C30, _MM256_LOADU_PS (C + 0)); _MM256_STOREU_PS (C + 8, _MM256_ADD_PS (C31, _MM256_LOADU_PS (C + 8)); C + = LDC; _mm256_storeu_ps (C + 0, _MM256_ADD_PS (C40, _MM256_LOADU_PS (C + 0)); _mm256_storeu_ps (C + 8, _MM256_ADD_PS (C41, _MM256_LOADU_PS (C + 8)); C + = LDC; _MM256_STOREU_PS (C + 0, _MM256_ADD_PS (C50, _MM256_LOADU_PS (C + 0)); _MM256_STOREU_PS (C + 8, _MM256_ADD_PS (C51, _MM256_LOADU_PS (C + 8)));}

우리는 매트릭스의 초기 값을 초기화하는 작은 보조 기능을 소개합니다.

void init_c (int m, int n, float * c, int ldc) {int j = 0; j <n; j + = 8) _mm256_storeu_ps (c + j, _mm256_setzero_ps ());} 

여기 LDA, LDB, LDC - 일반 경우의 LDC - 선행 치수가 해당 행렬의 경우).

그런 다음 곱셈 함수는 다음과 같은 양식을 취합니다.

void gemm_v3 (int m, int n, int k, const float * a, const float * b, float * c) {for (int i = 0, i <m; int j = 0) ; j <n; j + = 16) {init_c (6, 16, c + i * n + j, n); micro_6x16 (k, a + i * k, k, 1, b + j, n, c + i * n + j, n); }}} B.

우리는 그것을 실행하고 실행 시간을 78.5ms 또는 36.2 gflops로 얻습니다. 저것들. MicroKernel을 사용하면 매트릭스 곱셈을 거의 3 회까지 가속화 할 수있었습니다. 그러나 결과 속도는 여전히 최대에서 멀리 떨어져 있습니다. 지금 병목 현상은 어디에 있습니까?

  1. MATRIX B 재정렬 B (4 단계) B각 반복에 대한 마이크로 이사가는 매트릭스에서 2 개의 256 비트 벡터를로드합니다.
  2. 그리고 새로운 줄에서 매번. 이렇게하면 프로세서가 이러한 데이터를 효과적으로 캐싱 할 수 없게됩니다. 이러한 상황을 수정하기 위해 두 가지 변경 사항을 만들 것입니다. С매트릭스의 데이터를 복사하십시오 B.

동일한 마이크로 커널에 필요한 데이터가 근처에 설치되도록 임시 버퍼에서.

매트릭스의 검색 순서를 변경하십시오 

: 먼저 우리는 열을 걷고 그 다음 행에서만 걸을 것입니다. 이렇게하면 재정렬 된 매트릭스 값을 효율적으로 사용할 수 있습니다.

버퍼를 저장하려면 작은 구조를 얻을 것입니다 : B:

struct buf_t {float * p; int n; buf_t (int 크기) : n (크기), p ((float *) _mm_malloc (크기 * 4, 64)) {} ~ buf_t () {_mm_free (p); }}; 

특수 기능이 메모리를 강조 표시하는 데 특별한 기능을 사용하기 때문에 AVX 벡터를 다운로드 및 언로드하는 것은 정렬 된 데이터 중에 최적으로 작동하는 것이 중요합니다.

매트릭스 재정렬 기능 

void reorder_b_16 (int k, const float * b, int ldb, float * bufb) {for (int k = 0; k <k; + k, b + = ldb, bufb + = 16) {_mm256_storeu_ps (bufb + 0 , _mm256_loadu_ps (b + 0)); _mm256_storeu_ps (bufb + 8, _mm256_loadu_ps (b + 8)); }}}

실제로, GEMM 기능의 4 번째 버전 :

void gemm_v4 (int m, int n, int k, const float * a, const float * b, float * c) {for (int j = 0; j <n; j + = 16) {buf_t bufb (16 * k) ); reorder_b_16 (k, b + j, n, bufb.p); (int i = 0; i <m; i + = 6) {init_c (6, 16, c + i * n + j, n); micro_6x16 (k, a + i * k, k, 1, bufb.p, 16, c + i * n + j, n); }}}

시험 결과 (29.5ms 또는 96.5 gflops)는 우리가 올바른 트랙에 있음을 보여줍니다. 실제로 이론적으로 가능한 최대 80 %를 얻었습니다. B승리? 불행하게도. 우리가 테스트하기 위해 사용한 행렬의 크기 (m = n = k = 1152)는이 버전의 알고리즘에 편리하게 밝혀졌습니다. 100 배 (m = 1152, n = 1152, k = 115200)로 증가하면 알고리즘의 효율성은 39.5 gflops로 떨어집니다 - 거의 2.5 배. С캐시 L1 (5 단계)의 데이터 로컬 화

그래서 왜 증가하는 매개 변수 k가 알고리즘의 효과가 떨어지는가? 대답은 재정렬 된 값을 저장하는 데 사용한 버퍼의 크기에 있습니다.

...에 큰 값의 경우 단순히 프로세서의 캐시가되지 않습니다. 문제에 대한 해결책은 L1 데이터 캐시의 크기에 대한 값으로 제한됩니다. 인텔 프로세서의 경우 L1 데이터 캐시 크기는 32KB입니다. 버퍼 크기의 제한으로 MicrokeePloe는 모든 값 k에서 아니오를 실행하지만 L1 캐시의 구절의 범위만큼이나 실행됩니다. 매트릭스의 중간 계산 결과 

주 메모리에 저장됩니다.

캐시에서 다루는 데이터 영역 위의 계산을 수행하는 보조 기능을 소개합니다. 

void macro_v5 (int m, int n, int k, const float * a, int lda, const float * b, int ldb, float * bufb, float * c, int ldc) {for (int j = 0; j <n ; j + = 16) {reorder_b_16 (k, b + j, ldb, bufb); (int i = 0; i <m; i + = 6) micro_6x16 (k, a + i * lda, lda, 1, bufb, 16, c + i * ldc + j, ldc); }}}

주요 기능에서 우리는 Macroyadro를 호출 할 K에 따라주기를 추가합니다.

void gemm_v5 (int m, int n, int k, const float * a, const float * b, float * c) {const int l1 = 32 * 1024; int mk = std :: min (l1 / 4/16, k); BUF_T BUFB (16 * MK); (int k = 0; k <k + = mk) {int dk = std :: min (k, k + mk) - k; if (k == 0) init_c (m, n, c, n); MACRO_V5 (m, n, dk, a + k, k, b + k * n, n, bufb.p, c, n); }}} B측정 결과는 우리가 올바른 방향으로 움직이는 것을 보여줍니다. (m = 1152, n = 1152, k = 115200) 알고리즘의 성능은 78.1 gflops였습니다. 이것은 이전 버전보다 훨씬 낫지 만 중간 크기의 매트릭스보다 여전히 더 나쁩니다. AMatrix A를 재정렬하고 L2 캐시로 현지화 (6 단계)

하나의 마이크로커 패스에서 처리되는 크기 K를 나열하면 매트릭스의 데이터를 현지화 할 수있었습니다. 

캐시 L1에서. 매트릭스에서로드 된 데이터 A거의 3 배 적습니다. 그러나 동시에 데이터를 재정렬하여 일관되게 거짓말을합니다. 우리는 이것을위한 특별한 기능을 작성합니다. void reorder_a_6 (const float * a, int lda, int m, int k, float * bufa) {for (int i = 0; i <+ = 0; int k = 0; k <k; k + = 4) {const float * pa = a + k; __m128 a0 = _mm_mloadu_ps (PA + 0 * LDA); __m128 a1 = _mm_mloadu_ps (PA + 1 * LDA); __m128 a2 = _mm_loadu_ps (PA + 2 * LDA); __m128 a3 = _mm_mloadu_ps (PA + 3 * LDA); __m128 a4 = _mm_mloadu_ps (PA + 4 * LDA); __m128 a5 = _mm_mloadu_ps (PA + 5 * LDA); __m128 a00 = _mm_unpacklo_ps (a0, a2); __M128 A01 = _MM_UNPACKLO_PS (A1, A3); __m128 A10 = _mm_unpackhi_ps (a0, a2); __m128 a11 = _mm_unpackhi_ps (a1, a3); __m128 A20 = _mm_unpacklo_ps (a4, a5); __m128 a21 = _mm_unpackhi_ps (a4, a5); _mm_storeu_ps (bufa + 0, _mm_unpacklo_ps (a00, a01)); _mm_storel_pi ((__ m64 *) (bufa + 4), a20); _mm_storeu_ps (BUFA + 6, _mm_mm_mm_unpackhi_ps (a00, a01)); _mm_storeh_pi ((__ m64 *) (bufa + 10), A20); _mm_storeu_ps (BUFA + 12, _mm_mm_unpacklo_ps (A10, A11); _mm_storel_pi ((__ m64 *) (BUFA + 16), A21); _mm_storeu_ps (bufa + 18, _mm_mm_unpackhi_ps (a10, a11)); _mm_storeh_pi ((__ m64 *) (BUFA + 22), A21); BUFA + = 24; } A + = 6 * LDA; }}} 이후 데이터 매트릭스

이제 일관되게 이동 한 다음 매개 변수입니다 

LDA. AMacroyader에서는 더 이상 필요하지 않습니다. 또한 마이크로커 호출 매개 변수가 변경되었습니다.

void macro_v6 (int m, int n, int k, const float * a, const float * b, int ldb, float * bufb, float * c, int ldc) {for (int j = 0; j <n; j + = 16) {REORDER_B_16 (K, B + J, LDB, BUFB); (int i = 0; i <m; i + = 6) micro_6x16 (k, a + i * k, 1, 6, bufb, 16, c + i * ldc + j, ldc); }}} 

재정렬 된 매트릭스의 버퍼 크기

우리는 L2 프로세서 캐시의 크기를 제한합니다 (일반적으로 다양한 유형의 프로세서에 대해서는 256에서 1024KB입니다). 주요 기능은 변수 m에 의해 추가 사이클을 추가합니다.

void gemm_v6 (int m, int n, int k, const float * a, const float * b, float * c) {const int l1 = 32 * 1024, l2 = 256 * 1024; int mk = std :: min (l1 / 4/16, k) / 4 * 4; int mm = std :: min (l2 / 4 / mk, m) / 6 * 6; BUF_T BUFB (16 * MK); buf_t bufa (mk * mm); (int k = 0; k <k + = mk) {int dk = std :: min (k, k + mk) - k; (int i = 0; i <m; i + = mm) {int dm = std :: min (m, i + mm) - i; if (k == 0) init_c (dm, n, c + i * n, n); REORDER_A_6 (A + I * K + K, K, DM, DK, BUFA.P); MACRO_V6 (DM, N, DK, BUFA.P, B + K * N, N, BUFB.P, C + I * N, N); }}} B(m = 1152, n = 1152, k = 115200) - 88.9 gflops에 대한 테스트 측정 결과 - 중간 크기의 매트릭스에 대한 결과를 한 번 더 접근했습니다. B우리는 현금 L3 (7 단계)을 사용합니다.

프로세서에서는 캐시 L1 및 L2 외에도 캐시 L3 이외에도 캐시 L3 (일반적으로 크기는 커널에서 1-2MB입니다). 예를 들어 재정렬 매트릭스 값을 저장하기 위해 사용하려고 노력해 봅시다. 

불필요한 호출을 피하기 위해 REORDER_B_16. 추가 ReorderB 매개 변수가 Macroyader 함수에 나타나는이 매트릭스를보고합니다.

이미 주문한 : 

void macro_v7 (int m, int n, int k, const float * a, const float * b, int ldb, float * bufb, bool rederb, float * c, int ldc) {for (int j = 0; j <n ; j + = 16) {(reorderb) reorder_b_16 (k, b + j, ldb, bufb + k * j); (int i = 0; i <m; i + = 6) micro_6x16 (k, a + i * k, 1, 6, bufb + k * j, 16, c + i * ldc + j, ldc); }}}

주요 기능은 N에 대한주기를 추가합니다.

void gemm_v7 (int m, int n, int k, const float * a, const float * b, float * c) {const int l1 = 32 * 1024, l2 = 256 * 1024, l3 = 2 * 1024 * 1024; int mk = std :: min (l1 / 4/16, k) / 4 * 4; int mm = std :: min (l2 / 4 / mk, m) / 6 * 6; int mn = std :: min (l3 / 4 / mk, n) / 16 * 16; buf_t bufb (mn * mk); buf_t bufa (mk * mm); for (int j = 0; j <n; j + = mn) {int dn = std :: min (n, j + mn) - j; (int k = 0; k <k + = mk) {int dk = std :: min (k, k + mk) - k; (int i = 0; i <m; i + = mm) {int dm = std :: min (m, i + mm) - i; if (k == 0) init_c (dm, dn, c + i * n + j, n); REORDER_A_6 (A + I * K + K, K, DM, DK, BUFA.P); MACRO_V7 (DM, DN, DK, BUFA.P, B + K * N + J, N, BUFB.P, i == 0, C + I * N + J, N); }}}}

(m = 1152, n = 1152, k = 115200)의 측정 결과는 97.3 gflops에 결과를줍니다. 저것들. 우리는 중간 크기의 매트릭스에 대한 결과를 초과했습니다. 사실, 우리는 보편적 알고리즘을 받았습니다 (실제로 다음 섹션의 제한 사항에 대해서는, 이론적으로 이론적으로 달성 가능한 최원의 약 80 %)이 행렬의 모든 크기에 대해 작동합니다. 이것은 결국 우리가 밝혀 졌음을 멈추고 묘사하는 것이 좋습니다.

  • 알고리즘의 일반적인 계획 아래 그림은 결과 알고리즘의 계획을 보여줍니다. B마이크로 커널 A사이클 -1. B.

가변 k에 의해 매트릭스에서 재정렬 된 데이터

  • 캐시 L1의 무릎, 매트릭스에서 데이터 재정렬 캐시 L2의 LA. 이 금액은 레지스터 (캐시 L0)에 축적됩니다. 결과가 주 메모리에 기록됩니다. 마이크로 커널의 치수는 SIMD 벡터의 길이와 벡터 레지스터의 수에 의해 결정됩니다. 사이클의 길이는 캐시 L1의 크기에 의해 결정되며, 저장되는 위치 A매크로 야드
  • 사이클 -2. 변수에서 i. MicroKernel을 실행중인 매트릭스의 재정렬 데이터로 실행합니다 BL2 캐시에 거짓말을합니다. B.

사이클 -3.

가변적 인 j. MicroKernel을 실행중인 매트릭스의 재정렬 데이터로 실행합니다

  • L3 캐시에 거짓말을합니다. 선택적으로 누락 된 데이터를 다시 입력하십시오 Macroyard의 치수는 캐시 값에 의해 결정됩니다. A기본 기능 A사이클 -4. С.
  • 변수에서 i. 매크로 - 남자가 매트릭스에서 실행됩니다 ...에 각 반복은 값을 켜 웁니다 A и B.
  • ...에 선택 사항은 매트릭스 값을 초기화합니다 사이클 5. B.

가변 k에 의해 매크로 - 남자는 행렬에서 실행됩니다

사이클 -6.

  1. 가변적 인 j. 매크로 - 남자가 매트릭스에서 실행됩니다
  2. 어떤 장면 뒤에 남아있는 것은 무엇입니까?
  3. 매트릭스 곱셈 알고리즘에서 사용되는 기본 원칙을 제시하는 과정에서는 의식적으로 작업을 단순화했으며, 그렇지 않으면 어떤 기사에도 적합하지 않습니다. 아래에서는 알고리즘의 주요 본질을 이해하기 위해 중요하지 않은 몇 가지 질문을 설명하지만 실용적인 구현에 매우 중요합니다.
  4. 실제로, 불행하게도, 매트릭스의 가장자리가 특별한 방법으로 처리되어야하기 때문에 매트릭스의 크기가 항상 마이크로커의 크기로 브랜드화되는 것은 아닙니다. 다른 크기의 마이크로커널을 구현 해야하는 경우가 있습니다.
  5. 다양한 유형의 프로세서의 경우 다른 마이크로 스타트 및 재정렬 기능 세트가 구현됩니다. 또한 마이크로 카르 넬은 더블 정확도와 복소수의 숫자에도 적용됩니다. 다행히도 동물원 마이크로 오더는 이들에 의해서만 제한되어 있으며 최상위 레벨에서는 코드가 매우 보편적입니다.
  6. Microofer는 종종 어셈블러에 직접 작성됩니다. 또한 사이클의 추가 방전을 수행하십시오. 그러나 이것은 중요한 가속화로 이어지지 않습니다. 주요 최적화는 프로세서 메모리의 캐시 계층 구조를 효과적으로 사용하는 것입니다.

소형 매트릭스 (측정을 위해)의 경우 특수 알고리즘이 사용됩니다. 때로는 재정렬이 효과적으로 재정렬되지 않으며 때로는 매트릭스의 또 다른 상황 순서를 적용 할 필요가 있습니다. 때로는 특별한 마이크로 커널을 구현합니다.

매트릭스 곱셈을위한 일반화 된 알고리즘에서는 3 개의 행렬을 모두 전환 할 수 있습니다. 가능한 알고리즘의 수가 8 번 증가하는 것처럼 보입니다! 다행히도 입력 데이터를 재정렬하는 응용 프로그램은 모든 경우가 undelled microkers를 수행 할 수 있습니다.

거의 모든 현대 프로세서는 멀티 코어입니다. 매트릭스 곱셈의 라이브러리는 멀티 스레딩을 사용하여 계산을 가속화합니다. 일반적으로 다른 스레드에 의해 해당 작업이 끊어진이 작업을 위해 또 다른 1-3 개의 추가 사이클이 사용됩니다.

.

결론

Добавить комментарий