我正在尝试将大约 100 万个值分配给 100x100 逻辑矩阵,如下所示:
CC(Labels,LabelsXplusOne) = true;
其中 CC 为 100x100 逻辑,Labels、LabelsXplusOne 为 1024x768 int32。
现在的问题是上述语句在现代 CPU 上大约需要 5 分钟才能完成。 显然它在 MATLAB 中实现得很糟糕,那么我们如何才能在不借助循环的情况下使上面的代码运行得更快呢?
如果您想知道,我需要这个语句来计算整数(而不是二进制)图像中的 Blob 。
还有:
max(max(Labels)) = 100
max(max(LabelsXplusOne)) = 100
编辑: 好,我知道了。也许这会在未来帮助其他人:
tic; CC(sub2ind(size(CC),Labels,LabelsXplusOne)) = true; toc;
Elapsed time is 0.026414 seconds.
现在好多了。
最佳答案
有几个问题引起了我的注意......
我感觉你正在做matrix indexing错误的。就目前而言,将发生的情况是
Labels
中的每个值都将与LabelsXplusOne
中的每个值配对,为CC
的行和列生成 (1024*768)^2 个总索引对。这可能就是花了这么长时间的原因。您可能想要的是仅使用每对值作为索引,例如
Labels(1,1),LabelsXplusOne(1,1)
,Labels(1,2)、LabelsXplusOne(1,2)
等。为此,您应该将索引转换为 linear indices使用函数SUB2IND .此外,您的矩阵
CC
仅包含 10,000 个条目,但每个索引矩阵包含 786,432 个整数值。这意味着您最终将多次将值true
分配给CC
中的同一条目。您应该首先使用函数 UNIQUE 删除冗余的索引集。 ,然后使用它们将值分配给CC
。
这就是我认为你想要的:
CC(unique(sub2ind(size(CC), Labels, LabelsXplusOne))) = true;
关于MATLAB大规模多任务技术,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13052387/