【问题标题】:Vectorizing cell find and summing in Matlab在 Matlab 中矢量化单元格查找和求和
【发布时间】:2017-03-01 23:47:01
【问题描述】:

有人能告诉我如何将这段代码从迭代实现更改为矢量化实现,以提高 Matlab 的性能吗?目前在我的机器上,i=1:20 的每个 i 大约需要 8 秒。

classEachWordCount = zeros(nwords_train, nClasses);
for i=1:nClasses % (20 classes)
    for j=1:nwords_train % (53975 words)
        classEachWordCount(j,i) = sum(groupedXtrain{i}(groupedXtrain{i}(:,2)==j,3));
    end
end

如果上下文有帮助,groupedXtrain 是一个由 20 个矩阵组成的单元格,它们代表不同的类,其中每个类矩阵有 3 列:document#,word#,wordcount,并且行数不相等(数万)。我正在尝试计算每个班级的每个单词的总数。所以classEachWordCount 应该是一个大小为53975x20 的矩阵,其中每一行代表一个不同的单词,每一列代表一个不同的标签。必须有一个内置函数来帮助完成这样的事情,对吧?

例如groupedXtrain{1} 可能会像这样开始:

doc#,word#,wordcount
    1 1 3
    1 2 1
    1 4 3
    1 5 1 
    1 8 2
    2 2 1
    2 5 4
    2 6 2

【问题讨论】:

  • 看起来像是 accumarray 的工作
  • 谢谢,看起来很有希望,我会调查一下

标签: matlab performance vectorization


【解决方案1】:

如 cmets 中所述,您可以使用 accumarray 为每个类的第二列中的每个唯一值汇总第三列中的值

results = zeros(nwords_train, numel(groupedXtrain));

for k = 1:numel(groupedXtrain)
    results(:,k) = accumarray(groupedXtrain{k}(:,2), groupedXtrain{k}(:,3), ...
                              [nwords_train 1], @sum);
end

【讨论】:

  • 我遇到的问题是,我认为现在每个 results{i} 的长度不同,而不是全部长度为 nwords_train 并且对于未找到的单词有零,所以我不知道哪一行总对应于哪个单词了。有没有快速解决方法?
  • @Jake 如果您希望它们都具有相同的大小,您可以将大小指定为accumarray 的第三个输入。更新
  • 我收到错误:使用 accumarray 时出错当 SUBS 是列向量时,第三个输入 SZ 必须是 [N 1] 的形式。
  • 等等,其实我认为单词的顺序是这样改变的。而不是每个单词的位置都放在最后,所以我仍然不知道哪一行对应于每个单词的总数。
  • @Jake 你不使用第 2 列中的相同值来对应每个类的相同单词吗?如果你这样做,应该没有问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
相关资源
最近更新 更多