Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何在Matlab脚本中优化这些FOR循环以节省执行时间_Arrays_Matlab_Multidimensional Array_Indexing_Nested Loops - Fatal编程技术网

Arrays 如何在Matlab脚本中优化这些FOR循环以节省执行时间

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循环的情况下进行大型数据集计算

我的WarpVec是一个大型5维数组,其中包含大量数据

我的算法比较当前空间旁边的3个空间(可以是NaN或任何实际值),以检查周围的3个单元格是否与当前空间相对。基本上,如果中心空间为NaN,且3个相邻区域为非NaN值,则我会画一个标志,反之亦然,当中心为非NaN值且其3个相邻区域为NaN值时

如果我有什么选择呢?有没有更好的索引方法?我可以在某个地方使用向量分析来缩短运行时间吗

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], :));