2017-03-06 86 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) = (bsxfun(@eq, ne.' , 1:buses) | bsxfun(@eq, nt.' , 1:buses)) * y; 

在八度或Matlab R2016b可以當作使用:

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

第二嵌套的矢量循環:

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);