Arrays 如何在Matlab脚本中优化这些FOR循环以节省执行时间
我想知道是否有一种方法可以在不使用for循环的情况下进行大型数据集计算 我的WarpVec是一个大型5维数组,其中包含大量数据 我的算法比较当前空间旁边的3个空间(可以是NaN或任何实际值),以检查周围的3个单元格是否与当前空间相对。基本上,如果中心空间为NaN,且3个相邻区域为非NaN值,则我会画一个标志,反之亦然,当中心为非NaN值且其3个相邻区域为NaN值时 如果我有什么选择呢?有没有更好的索引方法?我可以在某个地方使用向量分析来缩短运行时间吗Arrays 如何在Matlab脚本中优化这些FOR循环以节省执行时间,arrays,matlab,multidimensional-array,indexing,nested-loops,Arrays,Matlab,Multidimensional Array,Indexing,Nested Loops,我想知道是否有一种方法可以在不使用for循环的情况下进行大型数据集计算 我的WarpVec是一个大型5维数组,其中包含大量数据 我的算法比较当前空间旁边的3个空间(可以是NaN或任何实际值),以检查周围的3个单元格是否与当前空间相对。基本上,如果中心空间为NaN,且3个相邻区域为非NaN值,则我会画一个标志,反之亦然,当中心为非NaN值且其3个相邻区域为NaN值时 如果我有什么选择呢?有没有更好的索引方法?我可以在某个地方使用向量分析来缩短运行时间吗 for X = 1:size(WarpVec
for X = 1:size(WarpVec, 1)
for L = 1:size(WarpVec, 2)
for k = 1:size(WarpVec,3)
for i = 2:(size(WarpVec, 4)-1)
for j = 2:(size(WarpVec, 5)-1)
tri1(X, L, k, i, j) = ~isnan(WarpVec(X, L, k, i, j)) && (~isnan(WarpVec(X, L, k, i-1, j-1))...
|| ~isnan(WarpVec(X, L, k, i, j-1)) || ~isnan(WarpVec(X, L, k, i-1, j)))...
|| (~isnan(WarpVec(X, L, k, i-1, j-1)) && ~isnan(WarpVec(X, L, k, i, j-1))...
&& ~isnan(WarpVec(X, L, k, i-1, j)));
tri2(X, L, k, i, j) = ~isnan(WarpVec(X, L, k, i, j)) && (~isnan(WarpVec(X, L, k, i, j-1))...
|| ~isnan(WarpVec(X, L, k, i+1, j-1)) || ~isnan(WarpVec(X, L, k, i+1, j)))...
|| (~isnan(WarpVec(X, L, k, i, j-1)) && ~isnan(WarpVec(X, L, k, i+1, j-1))...
&& ~isnan(WarpVec(X, L, k, i+1, j)));
tri3(X, L, k, i, j) = ~isnan(WarpVec(X, L, k, i,j)) && (~isnan(WarpVec(X, L, k, i-1, j))...
|| ~isnan(WarpVec(X, L, k, i-1, j+1)) || ~isnan(WarpVec(X, L, k, i, j+1)))...
|| (~isnan(WarpVec(X, L, k, i-1, j)) && ~isnan(WarpVec(X, L, k, i-1, j+1))...
&& ~isnan(WarpVec(X, L, k, i, j+1)));
tri4(X, L, k, i, j) = ~isnan(WarpVec(X, L, k, i,j)) && (~isnan(WarpVec(X, L, k, i+1, j))...
|| ~isnan(WarpVec(X, L, k, i+1, j+1)) || ~isnan(WarpVec(X, L, k, i, j+1)))...
|| (~isnan(WarpVec(X, L, k, i+1, j)) && ~isnan(WarpVec(X, L, k, i+1, j+1))...
&& ~isnan(WarpVec(X, L, k, i, j+1)));
end
end
end
end
end
第一次在这里发布。谢谢你的帮助。非常感谢。让我们通过使用布尔索引,找出最后两个for循环:
tri1=true(size(WarpVec, 1), size(WarpVec, 2), size(WarpVec,3), size(WarpVec,4), size(WarpVec,5);
tri2=tri1;% same for tri3 and tri4.
for X = 1:size(WarpVec, 1)
for L = 1:size(WarpVec, 2)
for k = 1:size(WarpVec,3)
tri1(X, L, k, ~isnan(WarpVec(X, L, k, :, :)) & (~isnan(WarpVec(X, L, k, [1,1:end-1], [1,1:end-1]))...
| ~isnan(WarpVec(X, L, k, :, [1,1:end-1])) | ~isnan(WarpVec(X, L, k, [1,1:end-1], :)))...
| (~isnan(WarpVec(X, L, k, [1,1:end-1], [1,1:end-1])) & ~isnan(WarpVec(X, L, k, :, [1,1:end-1]))...
& ~isnan(WarpVec(X, L, k, [1,1:end-1], :))))=true;
tri2(X, L, k, ~isnan(WarpVec(X, L, k, :, :)) & (~isnan(WarpVec(X, L, k, :, [1,1:end-1]))...
| ~isnan(WarpVec(X, L, k, [2:end,end], [1,1:end-1])) | ~isnan(WarpVec(X, L, k, [2:end,end], :)))...
| (~isnan(WarpVec(X, L, k, :, [1,1:end-1])) & ~isnan(WarpVec(X, L, k, [2:end,end], [1,1:end-1]))...
& ~isnan(WarpVec(X, L, k, i+1, j))))=true;
%same for tri3, tri4.
end
end
end
如果您有足够的ram,还可以使用更快的形式:
isw=isnan(WarpVec);
tri1=~isw(:,:,:, :, :) & (~isw(:,:,:, [1,1:end-1], [1,1:end-1])...
| ~isw(:,:,:, :, [1,1:end-1]) | ~isw(:,:,:, [1,1:end-1], :)...
| (~isw(:,:,:, [1,1:end-1], [1,1:end-1])) & ~isw(:,:,:, :, [1,1:end-1])...
& ~isw(:,:,:, [1,1:end-1], :));