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'循环下面进行矢量化,这符合上面的代码?
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 :(得分:0)
第一个嵌套循环可以被矢量化为:
Y(1:size(Y,1)+1:end) = (bsxfun(@eq, ne.' , 1:buses) | bsxfun(@eq, nt.' , 1:buses)) * y;
在Octave或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);