Performance 有没有一种方法可以让这个代码更快,如果可能的话可以避免循环?
Performance 有没有一种方法可以让这个代码更快,如果可能的话可以避免循环?,performance,matlab,loops,matrix,runtime,Performance,Matlab,Loops,Matrix,Runtime,A1、B1、C1、A2、B2和C2是具有相同维度的6矩阵4435X2000 我必须找到I、j和k的值,其中A1(k,2000)==A2(I,j)和B1(k,2000)==B2(I,j)和C1(k,2000)==C2(I,j),条件是X(k)==1和Y(I,j)==1 目标是找到:计数器、L、T和D 有没有办法让这段代码更快?我可以避免循环吗 counter=0; L(1)=0; T(1)=0; D(1)=0; for k=1:4435 if X(k)==1 % X is a
A1
、B1
、C1
、A2
、B2
和C2
是具有相同维度的6矩阵4435X2000
我必须找到I
、j
和k
的值,其中A1(k,2000)==A2(I,j)
和B1(k,2000)==B2(I,j)
和C1(k,2000)==C2(I,j)
,条件是X(k)==1和Y(I,j)==1
目标是找到:计数器、L、T和D
有没有办法让这段代码更快?我可以避免循环吗
counter=0;
L(1)=0;
T(1)=0;
D(1)=0;
for k=1:4435
if X(k)==1 % X is a vector (4435x1)
F(k,:) = [A1(k,2000) B1(k,2000) C1(k,2000)]
for i=1:4435
for j=100:1999
if Y(i,j)==1 % Y is a matrix (4435x1999)
if F(k,:) == [A2(i,j) B2(i,j) C2(i,j)]
counter = counter+1;
L(counter)=k;
T(counter)=i;
D(counter)=j;
end
end
end
end
end
end
我想要一个至少能节省80%计算时间的解决方案强>
并且没有错误消息:内存不足如果不真正解释代码,就很难确定代码实际应该完成什么。不过,我要试一试:
% Determine where X is true.
XTrue = X == 1;
% Extract values from A1,B1,C1 where X is true.
F ( XTrue , 1 : 3 ) = [ A1(XTrue,2000) B1(XTrue,2000) C1(XTrue,2000) ];
% Determine where Y is true.
YTrueIndex = find ( Y == 1 );
% Determine where the extracted values match
counter = [];
L = [];
T = [];
D = [];
for ( ii = 1 : length(YTrueIndex) )
indexCurrent = YTrueIndex(ii)
FRowsThatMatch = F(:,1)==A2(indexCurrent) & F(:,2)==B2(indexCurrent) & F(:,3)==C2(indexCurrent);
matchCount = length ( find ( FRowsThatMatch ) );
if ( matchCount > 0 )
counter = counter + matchCount;
[ i , j ] = ind2sub ( size ( Y ) , indexCurrent );
L = [ L , find ( FRowsThatMatch ) ];
T = [ T , ones(matchCount,1)*i ];
D = [ D , ones(matchCount,2)*j ];
end
end
看看这对你有什么好处-
%// Store X-Y data by calling X() and Y() functions
X_data = X(1:4435);
Y_data = Y(1:4435,100:1999);
range1 = 100:1999 %// define range for columns
A2 = A2(:,range1); %// Crop out A2, B2, C2 based on column-range
B2 = B2(:,range1);
C2 = C2(:,range1);
Y_data = Y_data(:,range1)==1;
%// Indices for dim-3
idx_X = find(X_data==1)
%// Map X==1 onto A1, B1, C1
A1Lr = A1(X_data==1,end)
B1Lr = B1(X_data==1,end)
C1Lr = C1(X_data==1,end)
%// Setup output array to store L, T, D as single Nx3 output array
out = zeros(sum(Y_data(:))*numel(A1Lr),3);
%// Try out(sum(Y_data(:)==1)*numel(A1Lr),3)=0; instead for speed!
%// Start collecting output indices
count = 1;
for iter1 = 1:numel(A1Lr)
[R,C] = find(Y_data & A2==A1Lr(iter1) & B2==B1Lr(iter1) & C2==C1Lr(iter1));
nR = numel(R);
out(count:count+nR-1,:) = [R C repmat(iter1,nR,1)];
count = count + nR;
end
out(find(out(:,1)==0,1):end,:)=[];
%// Packup the outputs
T = out(:,1)
D = out(:,2) + range1(1)-1
L = idx_X(out(:,3))
其中使用的变量的实际数据大小是什么?@Divakar:A1、A2、B1、B2、C1和C2:4435x2000if F(k,:)=
可能不是if F(k,:)=
?这是一个数组比较,而不是标量比较,对吗?@Daniel:是的,X和Y支持向量化操作。你能不能用简单的英语解释一下代码在做什么,而不是给我们看代码?这样,我们愿意做一些完全不同的事情,我们仍然可以实现你们的主要目标。我们还可以进一步优化您正在做的事情,如果我们不局限于优化您的特定做事方法。在知道它是否有效之前,我必须使用您的答案运行我的程序。通常我的代码要等五个小时才能得到结果!!!这可能是一辆四轮马车,但它是一个开始,摆脱了一对loopa。???使用==>查找输入参数不足时出错。错误在==>L=[L,find(FRowsThatMatch)];这可能是因为间距。。。MATLAB的空格容差不一致。查找(FRowsThatMatch)???使用==>horzcat时出错,内存不足。为您的选项键入帮助记忆。错误在==>D=[D,一(匹配计数,2)*j]@bzakY_数据的大小是多少??4435x1900和范围1:1x1900@bzak啊,对不起我的坏!将该行从Y_data=Y_data(:,range1)==1
toY_data=Y_data=1代码>并查看它是否有效????使用==>内存中的零时出错。为您的选项键入帮助记忆。错误输入==>输出=零(和(Y_数据(:)*numel(A1Lr),3);如果你花太多时间在我的问题上,我很抱歉@没关系,别担心!:)看看是否有效?