2

次のように、100x100 の論理行列に ~100 万の値を割り当てようとしています。

CC(Labels,LabelsXplusOne) = true;

ここで、CC は 100x100 論理であり、Labels、LabelsXplusOne は 1024x768 int32 です。

問題は、上記のステートメントが最新の CPU で完了するまでに約 5 分かかることです。明らかに、MATLAB での実装が適切ではないため、ループに頼らずに上記をより高速に実行するにはどうすればよいでしょうか?

ご参考までに、整数 (バイナリではない) 画像のブロブを計算するには、このステートメントが必要です。

また:

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

There are a couple of issues that jump out at me...

  1. I have the feeling you are doing the matrix indexing wrong. As it stands now, what will happen is every value in Labels will be paired with every value in LabelsXplusOne, producing (1024*768)^2 total index pairs for your rows and columns of CC. That's likely what's taking so long.

    What you probably want is to only use each pair of values as indices, like Labels(1,1),LabelsXplusOne(1,1), Labels(1,2),LabelsXplusOne(1,2), etc. To do this, you should convert your indices into linear indices using the function SUB2IND.

  2. Additionally, your matrix CC only contains 10,000 entries, yet your index matrices each contain 786,432 integer values. This means you will end up assigning the value true to the same entry in CC many times over. You should first remove redundant sets of indices using the function UNIQUE, then use them to assign values to CC.

This is what I think you want:

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