我对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%。因此,我想知道是否存在使用合适的矢量化方案重写上述代码的更优雅的方法,这将有助于提高其效率。我对此感到非常烦恼,在此方面的任何帮助我将不胜感激。太感谢了。
向量化代码-
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] 删除。
我来说两句