如何在Matlab中对这些循环进行矢量化?

如何在Matlab中对这些循环进行矢量化?,matlab,for-loop,matrix,vectorization,Matlab,For Loop,Matrix,Vectorization,我如何将上面代码后面的“for”循环矢量化 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;

我如何将上面代码后面的“for”循环矢量化

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

除了预分配和矢量化之外,是否还有其他代码增强,这些增强会极大地影响性能?(忘记gpu,集群)

第一个嵌套循环可以矢量化为:

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
在倍频程或Matlab R2016b中,它可以写成:

Y(1:size(Y,1)+1:end) = (bsxfun(@eq, ne.' , 1:buses) | bsxfun(@eq, nt.' , 1:buses)) * y;
第二个嵌套循环的矢量化:

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


第一个嵌套循环可以矢量化为:

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
在倍频程或Matlab R2016b中,它可以写成:

Y(1:size(Y,1)+1:end) = (bsxfun(@eq, ne.' , 1:buses) | bsxfun(@eq, nt.' , 1:buses)) * y;
第二个嵌套循环的矢量化:

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