【问题标题】:Parallel for loop matlab并行for循环matlab
【发布时间】:2012-11-24 11:09:27
【问题描述】:

您好,这是我第一次想使用 matlab 的并行工具箱。我有这个循环

for y=1:size(pxyvector,1)
    if (strcmp(pxyvector{y,1}, emotionword))&&(strcmp(pxyvector{y,2},tweet{x}))
          pxyvector{y,3} = pxyvector{y,3} +1;
          invector = true;
    end
end

我将如何同时进行这项工作 for。我阅读了 matlab 的切片变量部分,但我不明白如何在这里做到这一点。

pxyvector 是一个 100000x3 元胞数组

tweet{x} 是一个字符串

emotionword 也是一个字符串。

invector 是稍后在循环外使用的值。

所以基本上我将 pxyvector 的一行中的第一个值与情感词进行比较,并将pxyvector 的一行中的第二个值与tweet{x} 进行比较。如果他们是一样的。行中的第三个值递增。

在循环期间,相同的值不能增加两次。

这个for循环的问题是我需要改变一个在循环外使用的变量并增加一个值。

一些数据可供使用:http://ojtwist.be/pxyvector.mat(这个 .mat 文件中的变量是 pxyvector2,所以如果你想测试它,请在代码中更改它)

【问题讨论】:

  • 那么,当您尝试 parfor 时会出现哪个错误?顺便说一句,您可以拆分 pxyvector 并对不同的工作人员使用 SIMD 方法。
  • pxyvector 以不同的方式进行索引,可能会导致迭代之间的依赖关系。 invector 在 parfor 循环之后使用,但它的值是不确定的。 SIMD 方法在这里如何工作?
  • pxyvector 对我来说似乎很好,因为一次只触及一行,即并行计算应该没问题。但是,invector 是个问题。将该行更改为invector(y) = true; 怎么样?然后它也应该在parfor 循环中运行。在循环之后,只需使用invector = any(invector);
  • 您的第二个建议可能是该行的解决方案。但它仍然不会执行,因为“ pxyvector 以不同的方式指示......”错误
  • 能否请您稍微更改一下您的代码,以便有相同的情况,但让这里的其他人可以轻松地处理它?

标签: matlab parallel-processing


【解决方案1】:

我想这里的问题是 matlab 没有将单元矩阵作为普通矩阵处理(实际上 a{1,:} 的行为并不像您期望的那样)。

AFAIK,要使用parfor,您需要不同的数据组织,特别是作为3x1 cell 元素的Nx1 cell

例如以下作品

tot = size(pxyvector,1)
%%%%// just to reshape data correctly
pxvector_a = pxyvector;
pxyvector = cell(1,tot);
for i = 1:tot
   pxyvector{i} = {pxvector_a{i,1} pxvector_a{i,2} pxvector_a{i,3}};    
end
%%%%

 parfor y=1:tot
    if (strcmp(pxyvector{y}{1}, 'almost'))&&(strcmp(pxyvector{y}{2},'that'))
          pxyvector{y}{3} = pxyvector{y}{3} +1;
          invector = true;
    end
end

您仍然可以使用smpd,但您当前的数据组织将难以创建适当的分布式数组。

【讨论】:

  • @Ojtwist,可能是内存访问问题:数据分布变得更加随机。尝试将事物分开,以便拥有 3 个 (Nx1) 元胞数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-05
  • 2021-10-06
  • 1970-01-01
  • 2017-04-18
  • 2023-03-24
  • 2016-08-10
  • 2013-12-12
相关资源
最近更新 更多