2012-02-20 8 views
0

나는 두 개의 행렬 W2와 hiddenLayer를 얻었고 그것들의 곱셈을 진행하려고한다. W2 크기는 12x50이고 숨겨진 크기는 50x1입니다. 위의 계산을위한 적절한 코드는 다음과 같습니다.행렬의 승수

for(int h=0; h<50; h++){ 
     for(int k=0; k<12; k++){ 
     outputLayer += W2[k][h]*HiddenLayer[h]; 
     } 
} 

또는 내가 처음 k-for에 넣어야합니까 ??

+1

같은해야 모든 코드에 따라서

b = Ax ⇔ bi = Σk=1..m Ai,k xk for i = 1...n (A is an n x m matrix).

모든 : HiddenLayer이 벡터 너무 때문에, 이것은 정말 위의 공식을 단순화하는 행렬 곱셈하지만 행렬 벡터 곱셈, 아니다 어쩌면'outputLayer [k]'또는 그와 비슷한 것일 수도 있습니다. 루프를 전환해야 할 수도 있습니다. 버전과 프로필을 모두 테스트하십시오. –

+0

예, 전환해야했습니다. –

+0

그 의미는 당신이 가지고 있었던 것이 아니라 두 가지 순서 중 하나가 다른 것보다 훨씬 빠르다는 것입니다. 방금 시도해야합니다. –

답변

2

행렬 곱셈 is defined as :

C = AB ⇔ Ci,j = Σk=1..n Ai,k Bk,j for i,j = 1...n (in case of square matrices).

따라서 outputLayer는 벡터이다.

for(int row = 0; row < 12; row++){ 
    outputLayer[row] = 0; 
    for(int column = 0; column < 50; column++){  
     outputLayer[row] += W2[row][column]*HiddenLayer[column]; 
     } 
} 
+0

수정. 하지만 한 점도 추가 할 것입니다. 가장 일반적인 경우 행렬의 곱셈은 3 개의 루프를 포함합니다 (이 경우 행렬 중 하나는 실제로 벡터이므로 2 개의 루프). 이 3 개의 루프는 사용자가 제안한 순서대로 중첩 될 필요가 없으며 실제 주문하는 방법은 6 가지입니다. 행렬은 일반적으로 메모리에서 발생하기 때문에 올바른 루프 순서를 선택하면 CPU 캐시가보다 효율적으로 사용됩니다. 이러한 루프를 재정렬하면 여러 번 매트릭스를 빠르게 곱할 수 있습니다. 물론 이것은 큰 행렬에 적합합니다. – valdo

+0

@valdo : 사실입니다. 그러나 OP에 대해 가능한 한 간단하게 답을하고 싶습니다. 특정 행렬이 항상 오른쪽에 있다는 것을 안다면 행렬을 조 변경하여'C [i] [j] + = A [i] [k] * B [j] [k]'를 사용할 수도 있습니다. 행렬 - 행렬 곱셈을 빠르게하는 많은 방법이 있지만 점근선 런타임은 항상 O (n^(2,807)) (Strassen 알고리즘 사용) 또는 O (n^3) (순차 곱셈 및 덧셈 사용)입니다. 원한다면 자유롭게 답을 편집하십시오 :). – Zeta

+0

괜찮아, 너희들에게 감사 해! –