performance - 请更高效的Matlab代码

标签 performance matlab

我是 matlab 的新手,所以我不知道 matlab 使代码更高效、更快的所有快捷方式。我一直在 matlab 中拼凑一些东西来完成家庭作业,同时专注于完成作业而不是效率。现在我发现我花在等待程序上的时间比实际编码的时间还多。下面是令人头疼的嵌套 for 循环,它需要永远完成。有没有没有那么多 forloop 的更快或更有效的编码方式?

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

最佳答案

不要循环,而是使用冒号。例如:

                    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())

关于performance - 请更高效的Matlab代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7973225/

相关文章:

matlab - 在 Matlab 中 try catch block

Java IEEE 64 位 754 double,要避免的值

c# - 如何获取静态网络摄像头图像

matlab - 从右到左对连接的组件进行排序

java - 同时在服务器上上传多个视频

matlab:矩阵中有多少行?

Matlab:具有不同参数的移动总和(回溯期)

python - 加速 Cython 实现点积乘法

performance - 至强 CPU (E5-2603) 后向内存预取

javascript - 如何在 jquery 中添加带有图像 slider 的链接