루프

2013-07-12 2 views
5

없는 작업은 다음과 벡터화 할 수있는 방법이 있나요 , k를 독립적 인 (3 차원 행렬 * 스칼라) 연산으로 분해함으로써 벡터, c에 의해 정의된다. 나는 이미이 함수 파일의 while 루프 내에서 피할 수없는 두 개의 for 루프를 이미 가지고 있으며 루프를 피하기 위해 최선을 다하고있다.루프

이것에 대한 통찰력은 대단히 감사하겠습니다!

-SC

+0

for 루프는 아마도 2D 매트릭스 이상을위한 최상의 옵션 일 것입니다. – Bee

+0

나는 그것이 두려웠다. 행렬 색인 생성으로 놀아 보려합니다. 예 : 'k ([3, 3; 3 3])'어떤 일이 일어 났는지보고 싶지만 슈퍼가 혼란 스러웠습니다. 어쨌든 골목길이 맞는지 확실하지 않습니다. –

답변

5

당신이 할 수있는이 사용 MTIMESX - 일상 matlab의 파일 교환에있는 제임스 Tursa에 의해 다차원를 지원하는 빠른 행렬 곱셈 도구입니다. 로

그것은 간단하다 :

C = mtimesx(A,B) 

수행하는 계산 C = A * B

+0

이것은 유망 해 보인다 - 감사합니다! –

1

뭔가 누락되지 않는 한,이 bsxfun하는 케이스이다

te=bsxfun(@times, k, permute(c,[3 4 1 2])); % c is a row vector 

은 또는

te=bsxfun(@times, k, permute(c,[3 4 2 1])); % c is a column vector 

이것은 k의 4 차원이 c와 크기가 같다고 가정합니다. 그렇지 않다면 서브 매트릭스 인덱스를 사용할 수 있습니다 :

te=bsxfun(@times, k(:,:,:,1:length(c)), permute(c,[3 4 2 1])); % c is a column vector 
+0

+1 사실 for 루프를 제거하고 한 줄 코드로 바꾸는 것이 원본보다 항상 빠르지는 않지만 노력은 +1합니다. 예를 들어, 코드는 원래 루프 코드보다 실행하는 데 75 % 더 오래 걸립니다. – Bee

+0

10x10x10x10 및 10x10x10x5000 매트릭스에서 10000 개의 테스트를 수행 할 경우 bsxfun은 for 루프보다 약 10 % 느리게 실행됩니다. 동의하지 않는 것이 더 빠르지 만 크기에 대해서는 동의하지 않습니다.) –