2

我正在尝试将约 100 万个值分配给 100x100 逻辑矩阵,如下所示:

CC(Labels,LabelsXplusOne) = true;

其中 CC 是 100x100 逻辑和标签,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.

现在好多了。

4

1 回答 1

2

有几个问题让我跳出来...

  1. 我感觉你在做矩阵索引错误。就目前而言,将会发生的是in 中的每个Labels都将与 中的每个值配对,LabelsXplusOne从而为您的行和列生成 (1024*768)^2 总索引对CC。这可能需要这么长时间。

    可能想要的只是将每对值用作索引,例如Labels(1,1),LabelsXplusOne(1,1),Labels(1,2),LabelsXplusOne(1,2)等。为此,您应该使用函数SUB2IND将索引转换为线性索引

  2. 此外,您的矩阵CC仅包含 10,000 个条目,但您的索引矩阵每个都包含 786,432 个整数值。这意味着您最终将多次将值分配给同一true条目。您应该首先使用函数UNIQUE删除冗余索引集,然后使用它们为.CC CC

这就是我认为你想要的:

CC(unique(sub2ind(size(CC), Labels, LabelsXplusOne))) = true;
于 2012-10-24T16:03:22.837 回答