简体   繁体   中英

frequency of each vector value in another vector matlab

I need to calculate the frequency of each value in another vector in MATLAB. I can use something like

for i=1:length(pdata)
   gt(i)=length(find(pf_test(:,1)==pdata(i,1)));
end  

But I prefer not to use loop because my dataset is quite large. Is there anything like histc (which is used to find the frequency of values in one vector) to find the frequency of one vector value in another vector?

If your values are only integers, you could do the following:

range = min(pf_test):max(pf_test);
count = histc(pf_test,range);

gt = count(ismember(range,a));
gt(~ismember(unique(a),b)) = 0;

If you can't guarantee that the values are integers, it's a bit more complicated. One possible method of it would be the following:

%restrict yourself to values that appear in the second vector
filter = ismember(pf_test,pdata);

% sort your first vector (ignore this if it is already sorted)
spf_test = sort(pf_test);

% Find the first and last occurrence of each element
[~,last] = unique(spf_test(filter));
[~,first] = unique(spf_test(filter),'first');

% Initialise gt
gt = zeros(length(pf_test));

% Fill gt
gt(filter) = (last-first)+1;

EDIT: Note that I may have got the vectors the wrong way around - if this doesn't work as expected, switch pf_test and pdata . It wasn't immediately clear to me which was which.

You mention histc . Why are you not using it (in its version with two input parameters)?

>> pdata = [1 1 3 2 3 1 4 4 5];
>> pf_test = 1:6;
>> histc(pdata,pf_test)
ans =
     3     1     2     2     1     0

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM