2017-03-06 3 views
1
function[Y] = busadmittance(z) 
ne = z(:,1); nt = z(:,2); r = z(:,3); x = z(:,4); lines = length(ne); 
buses = max(max(ne), max(nt));       
Z = r + 1j*x;        
y = ones(length(Z),1)./Z;        
Y = zeros(buses,buses);     

위의 코드를 따르는 'for'루프 아래에서 어떻게 벡터화 할 수 있습니까?Matlab에서 이러한 루프를 어떻게 벡터화 할 수 있습니까?

for k = 1:buses       
    for l = 1:lines 
     if ne(l) == k || nt(l) == k 
     Y(k,k) = Y(k,k)+ y(l); 
     end 
    end 
end 

for k = 1:lines       
    if ne(k)>0 && nt(k) > 0 
     Y(ne(k),nt(k)) = -y(k); 
     Y(nt(k),ne(k)) = -y(k); 
    end 
end 

사전 할당 및 벡터화 외에 성능에 큰 영향을 줄 수있는 추가 코드 향상 기능이 있습니까? GPU (클러스터 잊어)

답변

0

제 중첩 루프로 벡터화 할 수있다 중첩 초

Y(1:size(Y,1)+1:end) = (ne.' == 1:buses | nt.' == 1:buses) * y; 

벡터화 :

Y(1:size(Y,1)+1:end) = (bsxfun(@eq, ne.' , 1:buses) | bsxfun(@eq, nt.' , 1:buses)) * y; 

옥타브 matlab에 R2016b에서는 같이 writen 수 있다는 루프 :

k1= k(ne>0 & nt > 0); 
idx = accumarray([ne(k1),nt(k1)],1,size(Y),@any); 
Y(idx) = -y(k1); 
Y(idx.') = -y(k1); 

또는

k1= k(ne>0 & nt > 0); 
idx1 = sub2ind(size(Y),ne(k1),nt(k1)); 
idx2 = sub2ind(size(Y),nt(k1),ne(k1)); 
Y(idx1)=-y(k1); 
Y(idx2)=-y(k1);