【发布时间】:2012-11-04 11:01:08
【问题描述】:
我无法想象如何矢量化这组循环。任何指导将不胜感激。
ind_1 = [1,2,3];
ind_2 = [1,2,4];
K = zeros(3,3,3,3,3,3,3,3,3);
pp = rand(4,4,4);
for s = 1:3
for t = 1:3
for k = 1:3
for l = 1:3
for m = 1:3
for n = 1:3
for o = 1:3
for p = 1:3
for r = 1:3
% the following loops are singular valued except when
% y=3 for ind_x(y) in this case
for a_s = ind_1(s):ind_2(s)
for a_t = ind_1(t):ind_2(t)
for a_k = ind_1(k):ind_2(k)
for a_l = ind_1(l):ind_2(l)
for a_m = ind_1(m):ind_2(m)
for a_n = ind_1(n):ind_2(n)
for a_o = ind_1(o):ind_2(o)
for a_p = ind_1(p):ind_2(p)
for a_r = ind_1(r):ind_2(r)
K(s,t,k,l,m,n,o,p,r) = K(s,t,k,l,m,n,o,p,r) + ...
pp(a_s, a_t, a_r) * pp(a_k, a_l, a_r) * ...
pp(a_n, a_m, a_s) * pp(a_o, a_n, a_t) * ...
pp(a_p, a_o, a_k) * pp(a_m, a_p, a_l);
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
编辑:
代码通过将每个索引的 pps 乘积的值相加一或两次来创建索引从 1 到 3 的 rank-9 张量,具体取决于 ind_1 和 ind_2 的值.
编辑:
这是一个 3d 示例,但请记住,pp 的索引只是简单置换的事实在 9d 版本中没有保留:
ind_1 = [1,2,3];
ind_2 = [1,2,4];
K = zeros(3,3,3);
pp = rand(4,4,4);
for s = 1:3
for t = 1:3
for k = 1:3
% the following loops are singular valued except when
% y=3 for ind_x(y) in this case
for a_s = ind_1(s):ind_2(s)
for a_t = ind_1(t):ind_2(t)
for a_k = ind_1(k):ind_2(k)
K(s,t,k) = K(s,t,k) + ...
pp(a_s, a_t, a_r) * pp(a_t, a_s, a_k) * ...
pp(a_k, a_t, a_s) * pp(a_k, a_s, a_t);
end
end
end
end
end
end
【问题讨论】:
-
您能详细说明一下这段代码在做什么并添加 cmets 吗?
-
您能创建一个 2D 或 3D 示例来说明吗?与我们合作会更容易,创建示例可能会帮助您自己制定策略。
-
@tmpearce:已编辑以提供 3d 示例。
-
这是一些令人印象深刻的字母水果圈汤。
-
您是否查看过内置函数:mathworks.nl/help/matlab/ref/kron.html?如果可以使用此功能,我怀疑其他任何东西都会显示出更好的性能。
标签: matlab loops for-loop octave vectorization