【问题标题】:How can I vectorize these loops in Matlab?如何在 Matlab 中对这些循环进行矢量化?
【发布时间】:2017-03-06 03:57:26
【问题描述】:
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,集群)

【问题讨论】:

    标签: matlab for-loop matrix vectorization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多