How can I sort a matrix according to column IDs and identify same combinations?
1 回表示 (過去 30 日間)
古いコメントを表示
Hi,
I edit the question: I have matrix M with six columns and n rows:
M = [HomeID, WorkID, SchoolID, ShopID, timeS, timeP];
for example (lets say it is already sorted):
M = [101, 201, 301, 401, 5.46, 7.83;
101, 201, 301, 401, 3.63, 4.52;
101, 201, 301, 401, 2.785, 2.99;
102, 205, 301, 401, 3.53, 8.5;
102, 205, 301, 402, 3.48, 8.9];
I want to make it in the form of:
M2 = [101, 201, 301, 401, 3.958, 5.113;
102, 205, 301, 401, 3.53, 8.5;
102, 205, 301, 402, 3.48, 8.9];
I want to make calculation for each unique pair of SchoolID-WorkID combination within each unique pair of HomeID-WorkID combination and produce a matrix which will have no multiple Home-Work-School-Shop registers but the unique ones with the average values instead [M2(1,4)=(M(1,4)+M(2,4)+M(3,4))/3].
Thanks,
Iro
6 件のコメント
採用された回答
Jonathan Sullivan
2013 年 5 月 3 日
編集済み: Jonathan Sullivan
2013 年 5 月 3 日
Accumarray would come in handy here. It's a rather useful function, but might take a little bit of reading to understand it completely. Basically it takes in a list of coordinates (subscripts) and the values associated with them. It then does an operation on all those values that have the same subscripts, and outputs the resulting value as an entry in a matrix. In this case, you want to take the mean of those values that have the same HomeID WorkID SchoolID and ShopID.
Here's how we do it:
% Get the unique combinations, and the indexes
[HomeSchoolWorkShop_ID,~,y_ind] = unique(M(:,1:4),'rows');
x_ind = 1:size(M,2)-4;
% Make a list of the indexes and values
[X_Ind,Y_Ind] = meshgrid(x_ind,y_ind);
Inds = [Y_Ind(:) X_Ind(:)];
vals = reshape(M(:,5:end),[],1);
% Take the average
M2 = [HomeSchoolWorkShop_ID accumarray(Inds,vals,[],@mean)]
その他の回答 (0 件)
参考
カテゴリ
Help Center および File Exchange で Shifting and Sorting Matrices についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!