How do I remove duplicates from a structure array?

Suppose I create the following structure:
animals(1).name='Northern Mockingbird';
animals(1).class='Bird';
animals(2).name='Cheetah';
animals(2).class='mammal';
animals(3).name='Wolf';
animals(3).class='mammal';
animals(4).name='Eagle';
animals(4).class='Bird';
animals(5).name='Turtle';
animals(5).class='Reptile';
animals(6).name='Bee';
animals(6).class='Insect';
animals(7).name='Chameleon';
animals(7).class='Reptile';
animals(8).name='Barn Spider';
animals(8).class='Arachnid';
animals(9).name='Ant';
animals(9).class='Insect';
animals(10).name='Northern Cardinal';
animals(10).class='Bird';
Then I set animals(11) equal to animals(4), then I sort the whole thing through a littany of conversions/reshapings, the sortrows command and another littany of conversions/reshapings.
Is there some way to remove the duplicate entries from that array of structures?

 採用された回答

Azzi Abdelmalek
Azzi Abdelmalek 2013 年 5 月 16 日
編集済み: Azzi Abdelmalek 2013 年 5 月 16 日

0 投票

a= {animals.name}
b= {animals.class}
c=cellfun(@(x,y) [x y],a', b','un',0)
[ii,ii]=unique(c,'stable')
animals=animals(ii)

2 件のコメント

Azzi Abdelmalek
Azzi Abdelmalek 2013 年 5 月 16 日
編集済み: Azzi Abdelmalek 2013 年 5 月 16 日
%or
[ii,ii]=unique({animals.name},'stable')
animals=animals(ii)
Because if the name is the same, the class should be the same.
Craig
Craig 2013 年 5 月 17 日
Agreed. The actual structure array is file names and their respective paths; I used the animal array because it is easier to check, the difference (that I had not thought of) is that there could be files that have identical names but reside in different folders. Since your first solution looks for unique name/class pairs (through concatenation), it will still work for file names and paths.
'c=cellfun(@(x,y) [x y],a', b','un',0)' was baffling to me. I sort of understand the 'cellfun' and am slowly getting acquainted with the '@' symbol, but the '(x,y) [x y]' part was confusing to me at first. I think I get it now though. I couldn't find the 'un' property in the documentation; is it the same as 'UniformOutput'?

サインインしてコメントする。

その他の回答 (1 件)

Jonathan Sullivan
Jonathan Sullivan 2013 年 5 月 16 日

2 投票

It's not pretty, but this should work:
isUnique = true(size(animals));
for ii = 1:length(animals)-1
for jj = ii+1:length(animals)
if isequal(animals(ii),animals(jj))
isUnique(ii) = false;
break;
end
end
end
animals(~isUnique) = [];

2 件のコメント

Craig
Craig 2013 年 5 月 17 日
Thanks for the quick answer. I was hoping to avoid for loops, though I will admit that the loops you came up with are way prettier than I had thought a for loop solution would look like.
John King
John King 2021 年 5 月 5 日
Wow, only had to schange the name from "animals" to my struct name and this worked for me! Thank you Jonathan!

サインインしてコメントする。

カテゴリ

ヘルプ センター および File ExchangeStructures についてさらに検索

質問済み:

2013 年 5 月 16 日

コメント済み:

2021 年 5 月 5 日

Community Treasure Hunt

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

Start Hunting!

Translated by