2013-07-22 152 views
1

我写了这段代码,它工作正常,但我想优化它通过删除两个for循环如果可能的话。有没有人有任何想法,我可能会做到这一点?非常感谢!向量化嵌套循环

chosen_runs = [2:5]; 

% Configurations for each test in order 
XY = [0 1; 0 1; 0 9; 0 1; 0 2; 0 3; 0 4; 0 5; 11 12; 11 12]; 

% Inductance Matrix 
LMat = [0.0045 0.0045 0.0045 0.0044 0.0044 0.0044 0.0044 0.0044 0.0043 0.0043; 
     0.0045 0.0046 0.0046 0.0045 0.0045 0.0045 0.0045 0.0044 0.0044 0.0044; 
     0.0045 0.0046 0.0046 0.0046 0.0046 0.0046 0.0045 0.0045 0.0045 0.0045; 
     0.0044 0.0045 0.0046 0.0047 0.0047 0.0047 0.0046 0.0046 0.0046 0.0046; 
     0.0044 0.0045 0.0046 0.0047 0.0048 0.0048 0.0047 0.0047 0.0047 0.0046; 
     0.0044 0.0045 0.0046 0.0047 0.0048 0.0048 0.0048 0.0048 0.0048 0.0047; 
     0.0044 0.0045 0.0045 0.0046 0.0047 0.0048 0.0049 0.0049 0.0049 0.0048; 
     0.0044 0.0044 0.0045 0.0046 0.0047 0.0048 0.0049 0.0050 0.0049 0.0049; 
     0.0043 0.0044 0.0045 0.0046 0.0047 0.0048 0.0049 0.0049 0.0050 0.0050; 
     0.0043 0.0044 0.0045 0.0046 0.0046 0.0047 0.0048 0.0049 0.0050 0.0051]; 

% Declaration of Variables 
runs = chosen_runs; 
num = length(runs); 
in_point = zeros(num,1); 
out_point = zeros(num,1); 
L_Mid = zeros(10,num); 
L_Sides = zeros(10,num); 

%%%%%%%%%%%%%%%%%%%%%%%%%% 

in_point = XY(runs,1); % Creates a column vector each row of which is the in_point for a chosen run 
out_point = XY(runs,2); % Creates a column vector each row of which is the out_point for a chosen run 

in_point 
out_point 

for k = 1:10 
    for l = 1:num 

     L_Mid(k,l) = sum(LMat(k,1+in_point(l):out_point(l)));  % Creates a matrix, each column of which is the inductance (in between current leads) for a chosen run, each row is a different layer in the solenoid. 
     L_Sides(k,l) = sum(LMat(k,:))-L_Mid(k,l); % Creates a matrix, each column of which is the inductance (either side of the current leads) for a chosen run, each row is a different layer in the solenoid. 

    end 
end 

L_Mid 
L_Sides 
+1

你能把这个最小化为一个更简单的例子吗(http://sscce.org/)? –

回答

3

所以你要vectorise此代码:

for k = 1:10 
    for l = 1:num 
     L_Mid(k,l) = sum(LMat(k,1+in_point(l):out_point(l))); 
     L_Sides(k,l) = sum(LMat(k,:))-L_Mid(k,l); 
    end 
end 

第一步,除去外循环:

for l=1:num 
    L_Mid(:,l)=sum(LMat(:,1+in_point(l):out_point(l)),2); % Using the dim input to sum 
    L_Sides(:,l) = bsxfun(@minus,sum(LMat,2),L_Mid(:,l)); % Using bsxfun to subtract 
end 

下一步,L_Sides可以用一个操作来创建:

for l=1:num 
    L_Mid(:,l)=sum(LMat(:,1+in_point(l):out_point(l)),2); % Using the dim input to sum 
end 

L_Sides = bsxfun(@minus,sum(LMat,2),L_Mid); 

由于th in_point(l)的长度:out_point(l)是可变的,没有简洁的方法来对此进行矢量化(我知道的;人有我喜欢的好办法知道),你可以只是把它按原样或使用本:

L_Mid2 = arrayfun(@(x) ... 
    sum(LMat(:,1+in_point(x):out_point(x)),2), 1:length(in_point),'uniformoutput',false); 
L_Mid2=cat(2,L_Mid2{:}) 

但不会有性能优势,这是不太明显的是怎么回事,所以我不会使用这段代码。

+0

这非常优雅休!我很佩服!谢谢 – Howard