How do I remove duplicates from a structure array?

8 ビュー (過去 30 日間)
Craig
Craig 2013 年 5 月 16 日
コメント済み: John King 2021 年 5 月 5 日
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 日
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 日
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!

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

カテゴリ

Help Center および File ExchangeLoops and Conditional Statements についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by