嵌套循环和if语句在MATLAB中的向量化

ACuriousMind

我对MATLAB中的矢量化概念还不陌生,因此请原谅我在这方面的幼稚。我试图向量化以下MATLAB代码,其中包括嵌套for循环中的if语句:

h = zeros(dimV);
for a = 1 : dimV
    for b = 1 : dimV

        if a ~= b && C(a,b) == 1
           h(a,b) = C(a,b)*exp(-1i*A(a,b)*L(a,b))*(sin(k*L(a,b)))^-1;

        else if a == b

                for m = 1 : dimV
                    if m ~= a && C(a,m) == 1
                       h(a,b) = h(a,b) - C(a,m)*cot(k*L(a,m));
                    end
                end
            end

        end
    end
end

在这里,变量dimV指定矩阵的大小,h并且相当大,大约为100,并且C是大小为对称的方阵(先前定义)dimV,其所有非对角元素为0或1,对角元素为必然0.在与矩阵L的零相同的位置处,矩阵的元素也为零C遵循我在本网站此处找到的矢量化技术,我能够对代码进行矢量化(尽管是部分矢量化),并且我的MWE如下:

h = zeros(dimV);

idx = (C  == 1);
h(idx) = C(idx).*exp(-1i*A(idx).*L(idx)).*(sin(k*L(idx))).^-1;

for a = 1:dimV;   

    m = 1 : dimV;
    m = m(C(a,:) == 1);
    h(a,a) = - sum (C(a,m).*cot(k*L(a,m)));

end

我的主要问题是将for变量中循环转换a为向量,因为我需要使用的各个值a来解决的对角线元素h我使用MATLAB profiler比较了两个代码块的评估时间,后者的速度仅稍快一些,效率的提高确实微不足道。实际上,探查器显示,h(a,a)在第二种情况下,将值分配给该行的代码占用了执行时间的近50%。因此,我想知道是否存在使用合适的矢量化方案重写上述代码的更优雅的方法,这将有助于提高其效率。我对此感到非常烦恼,在此方面的任何帮助我将不胜感激。太感谢了。

迪卡卡(Divakar)

向量化代码-

diag_ind = 1:dimV+1:numel(C);
C_neq1 = C~=1;

parte1_2 = (sin(k.*L)).^-1;
parte1_2(C_neq1 & (L==0))=0;
parte1 = exp(-1i.*A.*L).*parte1_2;
parte1(C_neq1)=0;

h = parte1;

parte2 = cot(k*L);
parte2(C_neq1)=0;
parte2(diag_ind)=0;
h(diag_ind) = - sum(parte2,2);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章