2017-02-13 1 views
3

다음과 같은 문제가 있으며 for 루프 없이는 생각할 수 없습니다. 내가 싶어 무엇matlab에서 for 루프없이 행과 열의 행렬 곱셈

a=rand(N,3), b=rand(3,N)

은 다음과 같습니다 : b(:, i)*a(i, :) (3 * 3 행렬) 모든 i의 세 번째 차원에서 연결된

두 행렬을 고려하십시오.

따라서 위의 예에서 결과는 (3 * 3 * N) 행렬이어야합니다.

+0

가 아니 배 주위 '(3 ×) * (1 ×)의 -> 3x3' B는 벡터의 3 × 1이고 A는 벡터 × 3이다 N 열을 갖는 N 열이 – Paramar

+0

나는'kron'과'reshape'를 사용하는 아주 좋은 해결책이 있다고 확신하지만, 그것을 이해할 수는 없습니다. 그저 루프를 반복하십시오 –

+0

수정 한 내용이 맞습니까? 나는 그것이 1x3x3x1 -> 1x1의 곱셈이라고 생각한다. 그런데 크로네 커 제품은 여기서 필요한 것보다 더 많은 계산을하는 것처럼 보입니다. 치수는 3x3xN과 3Nx3N에서 볼 수 있습니다. – Paramar

답변

6

matlab에 R2016b 버전 :

c = reshape(a.',[1,3,N]) .* reshape(b,[3,1,N]); 

이전의 MATLAB 버전 :

c = repmat(reshape(a.',[1,3,N]),[3,1,1]) .* repmat(reshape(b,[3,1,N]),[1,3,1]); 

편집 : 여기 matlab에 R2016b (Win7x64)에 빠른 벤치 마크입니다. 벡터화 고속화가 50

Benchmark on R2016b (Win7x64)

+0

아! 방송 착취! 산뜻한. –

+1

감사! :) 나는 속도 향상을 보여주는 벤치 마크를 추가했다. 나는 그것의 가치가 있다고 생각합니다 ... – Florian

+0

@AnderBiguri 방송이란 무엇입니까? 전에는 들어 보지 못했습니다. [this] (https://mathworks.com/help/distcomp/broadcast-variables.html) 정의입니까? 그냥 궁금해서. 감사. – codeaviator