Count all unique elements in a 3d matrix

4 次查看(过去 30 天)
Hi all,
I have created a 3-d matrix randworld and would like to list the unique elements, count the number of unique elements and count the size of the unique elements for randworld(:,:,1), randworld(:,:,2) and randomworld(:,:,3). e.g. 4, 7, 13 is one unique element in this matrix with size 3.
randworld(:,:,1) =
4 4 3 11 11
4 9 3 9 10
2 7 9 3 9
7 6 6 9 3
4 1 15 15 13
randworld(:,:,2) =
7 7 6 3 3
7 11 6 6 10
11 4 11 9 6
4 15 15 6 9
1 8 5 5 5
randworld(:,:,3) =
13 13 9 4 4
13 11 9 3 6
13 4 11 12 3
4 1 1 3 12
11 5 15 15 15
Any help will be appreciated.
Thanks, Vishal
  3 个评论
Jan
Jan 2013-8-8
I do not understand: "4, 7, 13 is one unique element in this matrix with size 3." I see 9 elements of the value 4.
Could you provide a real example for the outputs for a [3x3x3] array?
Vishal
Vishal 2013-8-8
Sorry, I'll try and make it my question more clear. In the 3-d matrix randworld as listed below, I am trying to find the following:
randworld(:,:,1) =
4 4 3
4 9 3
2 7 9
randworld(:,:,2) =
7 7 6
7 11 6
11 4 11
randworld(:,:,3) =
13 13 9
13 11 9
13 4 11
1. list the unique elements-
4,7,13
2,11,13
9,11,11
7,4,4
3,6,9
9,11,11
2. count the number of unique elements
4,7,13 (count is 3) & 2,11,13 (count is 1) & 9,11,11 (count is 1) & 7,4,4 (count is 1) & 3,6,9 (count is 2)& 9,11,11 (count is 1)

请先登录,再进行评论。

采纳的回答

Azzi Abdelmalek
Azzi Abdelmalek 2013-8-8
a1=randworld(:,:,1)
a2=randworld(:,:,2)
a3=randworld(:,:,3)
v=cell2mat(arrayfun(@(x1,x2,x3) [x1 x2 x3],a1(:),a2(:),a3(:),'un',0));
[a,b,c]=unique(v,'rows','stable')
idx=histc(c,(1:size(a,1))')
% a represent unique vectors
% idx represent the repetition of each vector
  4 个评论
Azzi Abdelmalek
Azzi Abdelmalek 2013-8-8
Or simply
a1=randworld(:,:,1);
a2=randworld(:,:,2);
a3=randworld(:,:,3);
v1=[a1(:) a2(:) a3(:)];
[a,b,c]=unique(v,'rows','stable')
idx=histc(c,(1:size(a,1))')
Vishal
Vishal 2013-8-12
Yes, that works fine as well. Just a small typo. In line 4 replace v with v1. Thanks mate.
a1=randworld(:,:,1); a2=randworld(:,:,2); a3=randworld(:,:,3); v1=[a1(:) a2(:) a3(:)]; [a,b,c]=unique(v1,'rows','stable') idx=histc(c,(1:size(a,1))')

请先登录,再进行评论。

更多回答(2 个)

Jan
Jan 2013-8-8
It sounds like a basic task for unique and histc. But currently I do not understand the needs exactly.
  1 个评论
Azzi Abdelmalek
Azzi Abdelmalek 2013-8-8
I think, he wants to form vectors from each chanel:
vector1= [a(1,1,1) a(1,1,2) a(1,1,3)]
vector2=[a(1,2,1) a(1,2,2) a(1,2,3)]
and so on

请先登录,再进行评论。


dpb
dpb 2013-8-8
Permutation on above...
rpr=permute(r,[1 3 2]);
r2d=rpr(:,:,1);for i=2:size(rpr,3),r2d=[r2d; rpr(:,:,i)];end
u=unique(r2d,'rows','stable');
  2 个评论
Vishal
Vishal 2013-8-12
This solutions works fine if the task is to just list the unique rows. Thanks
dpb
dpb 2013-8-12
Well, one presumes one would use the u as in the previous to determine the rest having found them. Didn't see any point in repeating that.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Matrix Indexing 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by