矢量化或并行计算

8次浏览(最近30天)
Mingzhi而华
Mingzhi而华 2019年11月20日
评论道: Mingzhi而华2019年11月24日
这个for循环可以被向量化或者使用parfor代替吗?如果有,我该怎么做?
edgeID = 1:尺寸(1)
自我=自(edgeID);
sdl(自我)= sdl(自我)+ sdl_edge (edgeID);添加裂缝到自身
res(:,自我)= res(:,自我)+ flux_edge (:, edgeID);将助焊剂加入到自残留
结束%内部边迭代结束
"self "是一个有顺序的数组。这意味着我想循环这个“订单数组”,并根据该顺序(而不是12345的顺序)填充一些值。
我试过好几种方法,但都失败了。
2的评论
Mingzhi而华
Mingzhi而华 2019年11月21日
自我 是类似于[2 4 7 8 5 9 1 0 3 6 8 2 5 6]当我循环的时候 指数= 1,2,3,… 我需要一个这样的数组 2、4、7、… 相应的更新。上传精确的变量。初始化 sdl res
sdl = 0 (7219);
res = 0 (7219);
这表示所有元素都在 自我 不会超过7219。

登录评论。

接受的答案

1月
1月 2019年11月21日
这个循环不能并行化。如果 flux_edge 是一个向量而不是矩阵, accumarray 将有效地解决这个问题。试试这个:
%未测试和最喜欢的bug !
Sdl (selfs) = accumarray(selfs, sdl_edge);
resCell = splitapply(@(c) {sum(c, 2)}, flux_edge, self);
res(:, self) = cat(2, resCell{:});
的值 人失踪。因此,我不能测试代码,我假设,它包含严重的错误。我假设您可以找到剩余的问题并修改代码,直到它解决您的需求。
如果问题是时间紧迫的(整个程序的瓶颈),我会编写一个C-mex函数。在细胞中积累并在之后加入它们对内存消耗没有效率。
的大小 很重要。首先收集相等的值可能更有效 独特的 然后在这个列表上运行循环:
%的考验
v =独特(自);
SDL = 0 (1,7219);
Res = 0 (5,7219);
4 = 1:元素个数(v)
av = v (iv);
掩码= (selfs == av);
sdl (av) =总和(sdl_edge(面具));
Res (:, av) = sum(flux_edge(:, mask), 2);
结束
如果这个有一个合理的速度,你可以把它并行化 parfor
%的考验
v =独特(自);
nv =元素个数(v);
A = 0 (1, nv);
B = 0 (5, nv);
parfor4 = 1: nv
av = v (iv);
掩码= (selfs == av);
一笔(iv) = (sdl_edge(面具));
B(:, iv) = sum(flux_edge(:, mask), 2);
结束
SDL = 0 (1,7219);
sdl (v) =一个;
Res = 0 (5,7219);
res(:, v) = B;
4评论
Mingzhi而华
Mingzhi而华 2019年11月24日
实际上,整个代码涉及到该部分的2万多次重复。当然, self_edge flux_edge 每一次变化。但我认为,是的,你是对的,最耗时的部分应该是更新这两个。

登录评论。

更多的答案(0)

下载188bet金宝搏


释放

R2019a

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!