2017-03-06 8 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においては、以下のように書かれることができますループ:

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); 
関連する問題