2014-09-12 2 views
1

Z 보슨 recommended처럼 필자는 내적 제품 사용을 피하기 위해 열 - 주요 매트릭스 형식을 사용하고 있습니다. 그래도 벡터에 행렬을 곱할 때 피할 수있는 방법은 없습니다. 행렬 곱셈 기법은 행을 효율적으로 추출해야합니다 (행렬을 곱하면됩니다). 매트릭스에 의해 벡터 곱셈, 따라서 우리는 트랜스 :벡터 * 매트릭스 제품 효율 문제

(b * A)^T = A^T * b^T 

A 매트릭스, b, 전치 된 후, 열 벡터가되는 행 벡터이다. 행은 단일 스칼라이며 벡터 * 행렬 제품 구현은 A 행의 열의 내적을 b으로 비효율적으로 구현합니다. 이 점 제품을 수행하는 것을 피할 수있는 방법이 있습니까? 필자가 볼 수있는 유일한 방법은 열 추출을 필요로하는데, 이는 열 - 주요 행렬 형식에서 비효율적입니다.

+0

이 질문은 http://programmers.stackexchange.com에 더 적합합니다. –

+0

@Claptrap 왜? 나는 그 질문을 향상 시키거나 바꿀 용의가있다. – user1095108

+1

@Claptrap : 왜 프로그래머가 더 잘 맞는 지 모르겠습니다 ... –

답변

1

이것은 원래 게시물에서 이해할 수 있습니다 (내 첫 SO) efficient-4x4-matrix-vector-multiplication-with-sse-horizontal-add-and-dot-prod . 나머지 논의는 4x4 행렬에 적용됩니다.

여기서 행렬 시간 벡터 수행 할 두 가지 방법이있다 (V = V 및 U는 열 벡터이다 MU) 두 번째는 더 효율적인 동안 첫 번째 방법은 수학 클래스에서 더 익숙한

method 1) v1 = dot(row1, u), v2 = dot(row2, u), v3 = dot(row3, u), v4 = dot(row4, u) 
method 2) v = u1*col1 + u2*col2 + u3*col3 + u4*col4. 

SIMD 컴퓨터. 두 번째 방법은 벡터화 된 수학 (예 : numpy)을 사용합니다. 이제

u1*col1 = (u1x*col1x, u1y*col1y, u1z*col1z, u1w*col1w). 

의 벡터 시간 매트릭스를 살펴 보자

method 1) v1 = dot(col1, u), v2 = dot(col2, u), v3 = dot(col3, u), v4 = dot(col4, u) 
method 2) v = u1*row1 + u2*row2 + u3*row3 + u4*row4. 

지금 열 및 행의 역할이 교환했지만 방법이 여전히 효율적인 방법이다 (V = μM의 경우 V 및 u는 행 벡터이다) SIMD 컴퓨터에서 사용할 수 있습니다.

SIMD 컴퓨터에서 행렬 시간 벡터를 효율적으로 수행하려면 행렬을 열 주요 순서로 저장해야합니다. SIMD 컴퓨터에서 벡터 시간 행렬을 효율적으로 수행하려면 행렬을 행 우선 순서로 저장해야합니다.

필자가 이해하는 한, OpenGL은 열 주 순서를 사용하고 행렬 시간 벡터를 사용하며 DirectX는 행 우선 순서를 사용하고 벡터 시간 행렬을 사용합니다. 당신이 벡터 행렬 회 먼저 M2 다음 M3 순서 M1에서와 세 행렬 변환이있는 경우, 벡터 회는 어느 형태가 더

v = u*M1*M2*M3 //u and v are row vectors - DirectX form 

물품 행렬 당신

v = M3*M2*M1*u //u and v are column vectors - OpenGL form 

다 쓰고 효율성 측면에서 다른 것보다. 표기법의 문제입니다 (경쟁을 할 때 혼란을 일으킴).

행렬 * 행렬과 열 - 행렬 저장은 관련이 없다는 점에 유의해야합니다.

왜 수직 SIMD 명령어가 묻는 별도의 질문 인 수평 SIMD 명령어보다 빠른 지 알고 싶다면 간단히 수평 명령어는 병렬이 아닌 직렬로 동작하며 몇 가지 마이크로 연산으로 분해됩니다 (역설적으로 dppddpps보다 빠릅니다.

+0

입니다. 행렬이 열 주요 순서로 변환되지 않고 행을 추출하거나 내적을 수행하지 않으면 트릭을 적용 할 수 없습니까? – user1095108

+0

@ user1095108 "트릭"이란 무엇입니까? –

+0

한 번에 4 개 이상의 점 제품 (예 : 행렬 곱셈 코드에서 수행하는 작업)을 수행하므로 점 제품의 지침을 피할 수 있습니다. – user1095108