我编写了这段代码并且工作正常,但我想通过删除两个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
答案 0 :(得分:3)
所以你想要对这段代码进行矢量化:
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);
由于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{:})
但是没有性能优势,而且不太明显发生了什么,所以我不会使用这个代码。