2014-04-30 3 views
1

현재 for 루프를 사용하여 일련의 함수를 반복하는 프로그램이 있습니다. 나는 parfor를 사용해 보았지만 대학의 Matlab 버전에서만 작동합니다. for 루프가 필요하지 않도록이 핸들을 벡터화하고 싶습니다. 사용하고있는 방정식은 기본적으로 서로 다른 유형의 Bessel 함수를 호출하며 각각의 함수에 포함되어 있습니다.Matlab 벡터화 방정식 및 행렬 곱셈

다음은 내가하려는 일입니다. 각 m 값에 대해 필요한 각 행렬에 대한 행렬 요소의 벡터를 작성하십시오. 그런 다음 각 전체 매트릭스를 만듭니다. 나는 이것이 올바르게 작동하고 있다고 생각한다.

이 오류를 던지고 난 그냥 지칠대로 지친 오류 얻을 가운데 2 × 2로 왼쪽 × 2를 곱하더라도 ... 최종 행렬 곱셈에 :

을 ??? ==> mtimes를 사용한 오류 내부 행렬 치수가 일치해야합니다. == 오류> @ (m) CL (m) * CM (m) * CR (m)

% Vector for summation. 1 row, 301 columns with data from 0->300 
m_max=301; 
m=[0:m_max-1]; 

% Build the 300 elements for the left 2x2 matrix. 
[email protected](m) H1(m,alpha1); 
[email protected](m) H2(m,alpha1); 
[email protected](m) n1*dH1(m,alpha1); 
[email protected](m) n1*dH2(m,alpha1); 

% Build the 300 elements for the middle 2x2 matrix. 
[email protected](m) n1*dH2(m,alpha2); 
[email protected](m) -1*H2(m,alpha2); 
[email protected](m) -1*n1*dH1(m,alpha2);   
[email protected](m) H1(m,alpha2); 

% Build the 300 elements for the right 2x1 matrix. 
[email protected](m) J(m,alpha3); 
[email protected](m) n2*dJ(m,alpha3); 

% Build the left (CL), middle (CM) and right (CR) matrices. 
[email protected](m) [CL_11(m) CL_12(m);CL_21(m) CL_22(m)]; 
[email protected](m) [CM_11(m) CM_12(m);CM_21(m) CM_22(m)]; 
[email protected](m) [CR_11(m);CR_21(m)]; 

% Build the vector containing the products of each triplet of 
% matrices. 
[email protected](m) CL(m)*CM(m)*CR(m); 
cl=CL(m) 
cm=CM(m) 
cr=CR(m) 

c=CL(m)*CM(m)*CR(m) 

당신이 어떤 제안이나 권고 사항이있는 경우, 나는 그것을 대단히 감사하겠습니다! 저는 아직 Matlab의 초보자이며 행렬과 벡터를 사용하여 더 높은 수준의 능력을 개발하려고합니다.

감사합니다.

답변

3

귀하의 매트릭스는 2x2가 아닙니다. CL_11(m)m 1x300 벡터로 사용하면 CL_11(m)도 1x300이됩니다. 따라서 CL(m)은 2x301입니다. 이 문제를 해결하려면 행렬을 하나씩 계산해야합니다. 여기에는 두 가지 접근 방법이 있습니다.

c=arrayfun(C,m,'UniformOutput',false) 

는 셀 배열을 반환합니다, 그래서 c{1}m(1)에 해당 c{2}m(2)에 등

을 다른 한편으로는, 당신이

for i=1:m_max 
    c(:,:,i)=C(m(i)); 
end 

을 할 수있는 다음 c(:,:,i)은에 해당 m(1)

어떤 버전인지 확실하지 않습니다. 더 빠르지 만 코드로 충분히 쉽게 테스트 할 수 있습니다.

+0

대단히 감사합니다! 나는 이것을 시도 할 것이다 ... 그것은 총체적인 의미를 가진다. –

0

기호 도구 상자를 살펴보면 다루기 쉬운 기능을 만들 수 있습니다.

%% symbolic 
CL = sym('CL',[2,2]) 
CM = sym('CM',[2,2]) 
CR = sym('CR',[2,1]) 
r = CL*CM*CR 
f = matlabFunction(r) 
%% use some simple functions so it can be calculated as example 
[email protected](m) m+1; 
[email protected](m) m; 
[email protected](m) m-1; 
[email protected](m) m+2; 

[email protected](m) m; 
[email protected](m) m; 
[email protected](m) 2*m;   
[email protected](m) 2*m; 

[email protected](m) m; 
[email protected](m) 1-m; 

%% here the substitution happens: 
fh = @(m) f(CL_11(m),CL_12(m),CL_21(m),CL_22(m),CM_11(m),CM_12(m),CM_21(m),CM_22(m),CR_11(m),CR_21(m)) 
난 작은 속도 테스트 한 관심의 부족

:

[email protected](m) [CL_11(m) CL_12(m);CL_21(m) CL_22(m)]; 
[email protected](m) [CM_11(m) CM_12(m);CM_21(m) CM_22(m)]; 
[email protected](m) [CR_11(m);CR_21(m)]; 

[email protected](m) CL(m)*CM(m)*CR(m); 
tic 
r2 =arrayfun(C,v,'UniformOutput',false); 
t2=toc % gives 7.6874s for me 

N=1e5; 
v = 1:N; 

tic 
% .... insert symbolic stuff from above 
r1 = fh(v); 
t1=toc % gives 0.0842s for me 

tic 
r3 = nan(2,N); 
for i=1:N 
    r3(:,i)=C(v(i)); 
end 
t3=toc % 8.1503s for me 
+0

와우! 그것은 상당한 개선입니다! 정말 고맙습니다! –