我正在尝试将约1百万个值分配给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.
现在好多了。
答案 0 :(得分:2)
有几个问题突然出现在我身上......
我觉得你在做matrix indexing错了。现在看来,{em> Labels
中的每个值将与LabelsXplusOne
中的每个值配对,生成(1024 * 768) ^ CC
行和列的总索引对。这可能需要很长时间。
您可能想要的只是将每对值用作索引,例如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;