我有一系列结构,我执行两次搜索。首先,我搜索特定的颜色,然后搜索特定的城市。我得到两个包含我正在寻找的数据的数据集。到目前为止,没有问题。
从我得到的两个数据集中,我想找到两个数据集中存在的结构。
我试过'相交',因为这似乎是数组的一个很好的选择。但我似乎没有得到任何交叉数据......为什么不呢?
代码看起来像这样:
%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
答案 0 :(得分:3)
intersect
给你的错误信息是什么?这应该会给你一个提示,说明为什么它不起作用。
要完成你想要的任务,你不需要你的findPost
函数(它的作业在postsFound=0;
没有任何作用,而且误导名称变量matchFound
,顺便说一句。),你可以使用逻辑索引。
iRed = strcmpi({InfoArray.FavouriteColor},'red');
iLondon = strcmpi({InfoArray.City},'London');
InfoArray(iRed & iLondon)
iRed
包含1
确切颜色为红色的位置,iLondon
位于城市为伦敦的索引处,iRed & iLondon
确切位于两者都为真的位置 - 以及这些逻辑数组可以用作struct数组的索引。
编辑:或者,您可以获取数字索引(即find(strcmpi({db.(sField)},iField))
的结果并对其使用intersect
,获取数组元素的数字索引你想要,但这似乎有点......间接。