2017-01-20 1 views
2

내가 다음의 행렬곱하기

B = [1 2 3;4 5 6;7 8 9;10 11 12] 

다른 행렬 I는 행렬 A에 의해 행렬 B의 각 행을 곱하면 어떻게

A = [a b c;d e f;g h i] 

을 말해봐 또 다른 행렬 행렬의 각 행 (없이 for 루프를 사용하여), ie

for i = 1:4 
    c(i) = B(i,:)*A*B(i,:)' 
end 

미리 감사드립니다.

답변

4

당신은 사용할 수 있습니다

c = diag(B*A*B.'); 

그러나 이것은 단지의 대각선을 추출하기 위해 전체 4 × 4 행렬 계산, 그래서 그것은 매우 효율적이 아니다. 단지 원하는 값을 계산

보다 효율적인 방법이다 : 여기

c = sum(bsxfun(@times, permute(sum(bsxfun(@times, B, permute(A, [3 1 2])), 2), [1 3 2]), B), 2); 

위 코드 내역 :

c1 = sum(bsxfun(@times, B, permute(A, [3 1 2])), 2); % B(i,:)*A 
c = sum(bsxfun(@times, permute(c1, [1 3 2]), B), 2); % (B(i,:)*A)*B(i,:)' 

permute가 사용되도록 열의 개수 B에있는 열의 수는 A의 열 수와 일치합니다. bsxfun()의 요소 단위 승법에 따라 각 행이 합산됩니다 (permute이 행을 2 차원으로 이동 시켰음을 기억하십시오). 벡터 행렬 곱셈 B (i, :) * A의 효과가 재현됩니다. for 루프.

첫 번째 sum 뒤에 두 번째 차원은 싱글 톤 차원입니다. 따라서 두 번째 차원을 3 차원으로 이동시키고 2D 행렬을 생성하려면 두 번째 permute을 사용합니다. 이제 c1b은 모두 같은 크기입니다. 제 bsxfun()의 요소 와이즈 곱에 따라 각 열에 요약된다 B (I의 효과를 재생 (기억 permute 다시 2 차원으로 열을 시프트) : * * B (I, :) '.

이 접근법에서 숨겨진 이점에 유의하십시오. 행렬 곱셈의 결과를 복제하기 위해 요소 단위의 곱셈을 사용하므로 bsxfun() 호출에서는 인수의 순서가 중요하지 않습니다. 걱정할 것이 하나 더 적습니다!

또는 이후 matlab에 R2016b에서, 당신은 implicit expansion에, .*에 의해 감사를 bsxfun(@times,...)을 대체 할 수

c = sum(permute(sum(B.*permute(A, [3 1 2]), 2), [1 3 2]).*B, 2); 
+0

을가 MATLAB에서 곱셈/조작을 매트릭스에 올 때, 작업의 순서는 큰 고통이 될 수 있습니다. 요소 방식의 곱셈은 순서를 추적 할 필요가 없기 때문에이 접근법에는 숨겨진 장점이 있습니다. 그냥'bsxfun()'호출에 올바른 행렬이 있는지 확인하십시오. 대단한 대답 –

+1

@VladislavMartin 감사합니다! 광범위한 편집을 위해서도 –