请提高 Matlab 代码的效率

4

我是matlab的新手,所以不知道所有可以使代码更加高效快速的快捷方式。我一直在hack一个课程作业的matlab程序,专注于完成任务而不是效率。现在我发现我花费了更多的时间等待程序运行而不是编码。下面是一堆嵌套的for循环,需要很长时间才能完成。是否有更快或更有效的编码方法,而不需要使用这么多的for循环?

for i = 1:ysize
for j = 1:xsize
    MArr = zeros(windowSize^2, 2, 2);
    for i2 = i - floor(windowSize/2): i + floor(windowSize/2)
        if i2 > 0 && i2 < ysize + 1
            for j2 = j - floor(windowSize/2): j + floor(windowSize/2)
                if j2 > 0 && j2 < xsize + 1
                    mat =  weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); mappedGX(i2,j2)*mappedGY(i2,j2), mappedGY(i2,j2)^2];
                    for i3 = 1:2
                        for j3 = 1:2
                            MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3);
                        end
                    end
                end
            end
        end
    end
    Msum = zeros(2,2);
    for k = size(MArr)
        for i2 = 1:2
            for j2 = 1:2
                Msum = Msum + MArr(k,i2,j2);
            end
        end
    end
    R(i,j) = det(Msum) - alpha*(trace(Msum)^2);
    R = -1 * R;
end
end

9
请简要概括一下代码的主要功能,以便我们理解你的代码。使用“i、i2、i3”这样的变量名通常不是一个好的迹象... - whatsisname
1个回答

8

使用冒号代替循环。例如:

                    for i3 = 1:2
                        for j3 = 1:2
                            MArr(windowSize*(j2-(j - floor(windowSize/2))+1) + (i2-(i - floor(windowSize/2)) + 1),i3,j3) = mat(i3,j3);
                        end
                    end

可以写成:

 MArr(windowSize*(j2-(j-floor(windowSize/2))+1)+(i2-(i-floor(windowSize/2))+1),:,:)=mat;

当您找到所有可以完成此操作的地方时,请学习使用索引而不是循环,例如:

i2 = i - floor(windowSize/2): i + floor(windowSize/2);
i2=i2(i2>0 && i2<ysize+1);
j2 = j - floor(windowSize/2): j + floor(windowSize/2);
j2=j2(j2>0 && j2<xsize+1);
mat =  weight*[mappedGX(i2,j2)^2, mappedGX(i2,j2)*mappedGY(i2,j2); 

(高级用户请注意:如果 mappedGX 是矩阵且 i2/j2 不代表矩形子矩阵,则最后一行可能无法正常工作。在这种情况下,您将需要使用 sub2ind()。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接