Найти пересечение двух массивов структур в MATLAB - PullRequest
3 голосов
/ 14 сентября 2011

У меня есть массив структур, где я выполняю два поиска. Сначала я ищу определенный цвет, а затем я ищу определенный город. Я получаю два набора данных, содержащих данные, которые я искал. Пока проблем нет.

Из двух наборов данных, которые я получаю, я хотел бы найти структуры в двух наборах данных, которые присутствуют в обоих наборах данных.

Я попытался «пересечь», так как это казалось хорошим вариантом для массивов. Но я, кажется, не получаю никаких пересекающихся данных ... Почему бы и нет?

Код выглядит примерно так:

%Array of structs
InfoArray(1) = struct  ('Name','AAAA', 'City', 'London', 'Test', '70', 'FavouriteColor', 'red');          
InfoArray(2)= struct('Name','BBBB', 'City', 'London', 'Test', '20', 'FavouriteColor', 'blue');        
InfoArray(3)= struct('Name','CC', 'City', 'London', 'Test', '10', 'FavouriteColor', 'white');        
InfoArray(4)= struct('Name','DD', 'City', 'Stockholm', 'Test', '30', 'FavouriteColor', 'yellow');          
InfoArray(5)= struct('Name','EEEEE', 'City', 'Oslo', 'Test', '15', 'FavouriteColor', 'red');     
InfoArray(6)= struct('Name','FFFF', 'City', 'Oslo', 'Test', '15', 'FavouriteColor', 'red');      
InfoArray(7)= struct('Name','GG', 'City', 'Stockholm', 'Test', '80', 'FavouriteColor', 'blue');           
InfoArray(8)= struct('Name','H', 'City', 'Oslo', 'Test', '60', 'FavouriteColor', 'pink');       
InfoArray(9)= struct('Name','III', 'City', 'Oslo', 'Test', '5', 'FavouriteColor', 'red');      
InfoArray(10)= struct('Name','JJJJ', 'City', 'Stockholm', 'Test', '40', 'FavouriteColor', 'blue');   
InfoArray(11)= struct('Name','KKKK', 'City', 'London', 'Test', '70', 'FavouriteColor', 'white');       




%Find structs in array with color: 'red'

iColor = 'red';
[pFound,matchingFavouriteColors] = findPost(InfoArray,'FavouriteColor',iColor);

%Find structs in array with City: 'London'

iCity = 'London';
[pFound,matchingCity] = findPost(InfoArray,'City',iCity);

%Find the structs that are found in both of the data sets ????
[c, ia, ib] = intersect(matchingFavouriteColors, matchingCity);
disp([c; ia; ib]) 



function [matchFound, matchingData] = findPost(db,sField,iField)
    matches = find(strcmpi({db.(sField)},iField));
    if(isempty(matches))
        disp('No matches found');
        postsFound=0;
    else
        matchingData = db(matches(:));
        matchFound=length(matches);
    end

1 Ответ

3 голосов
/ 14 сентября 2011

Какое сообщение об ошибке выдает intersect?Это должно дать вам подсказку, почему это не работает.

Чтобы выполнить то, что вы хотите, вам не нужна ваша функция findPost (у которой есть присвоение, которое ничего не делает при postsFound=0;, и переменная с ошибочным именемmatchFound, кстати.), Вы можете использовать логическое индексирование.

iRed = strcmpi({InfoArray.FavouriteColor},'red');
iLondon = strcmpi({InfoArray.City},'London');
InfoArray(iRed & iLondon)

iRed содержит 1 с точно, где красный цвет, iLondon в индексах, где город Лондон,и iRed & iLondon точно там, где оба истинны - и эти логические массивы можно использовать в качестве индекса для вашего массива структуры.

Редактировать : В качестве альтернативы, вы можете получить числовые индексы (т.е. результаты find(strcmpi({db.(sField)},iField)) и использование intersect для них, получение числовых индексов для элементов массива, которые вы хотите, но это кажется немного ... косвенным.

...