Sorting a 64 x6 table

2 次查看(过去 30 天)
Yannick Tabot Njami
Dear All i need help with sorting a table and also new to matlab your time is appreciate
Please consider the attachment
Here is my algorithm :
ycoordinate= [20 50 80 110 140 170 200 230]
  • find all index example when y= 20
  • get the x coordinate values corresponding to to the indices y=20
  • get the corresponding mean_velocity,std_velocity, mean_pd ,std_pd vlalues
  • get them as a pair. meaning that for case when y=20 ,
  • x = [20 110 140 170 200 20 230 50 80] and mean_velocity=[1.3696 57.5733 57.7197 57.7133 58.0707 58.0194 58.1603 57.9150 57.7572]
  • then sorting them in ascending or descending order as
  • x=[20 20 50 80 110 140 170 200 230] mean_velocity=[1.3696 58.0194 57.9150 57.7572 57.5733 57.7197 57.7133 58.0707 58.1603 ]
  • and then plot mean_velocity against x. i want to do this for the the std_velocity, mean_pd ,std_pd as well.
  • i thought about a for loop but dont know how to go about it . please any help will be greatly appreciated
  • many thanks in advance
  3 个评论
Guillaume
Guillaume 2019-3-13
For table, sortrows is probably more appropriate than sort. You can pass the variable names directly to sortrows to prioritise the sort columns:
sortrows(sometable, {'ycoordinates', 'xcoordinates'}) %to sort first by y, then x.
Guillaume
Guillaume 2019-3-13
Yannick comment posted as an answer moved here (it's just code with no explanation):
Average_Table = table(xcoordinate,ycoordinate,mean_velocity,std_velocity, mean_pd ,std_pd);
for jj = 20 :30 :230
yindex=find(ycoordinate == jj);
%Deleting the first index to eliminat the offset value at y=20
if jj ==20
yindex(yindex==1)=[];
end
% getting just a table dor x and mean_velocity
newX=(xcoordinate(yindex));
newVY =mean_velocity(yindex);
%generated table as a pair
tableXY =[newX newVY]
% soting out the table
preallocating memory for sorted table
sortedtable =zeros(length(tableXY),2)
sortedtable(:,1)=sort(tableXY(:,1))
sortedX = sortedtable (:,1)
%Going through each table to look for corresponding indeces and match .
for N =1:length(tableXY)
sortedtable(N,2:end) =tableXY(find(ismember(tableXY(:,1),sortedtable(N))),2)
% sorted Y coordinates
sortedY = sortedtable(:,2);
end
hold on
plot(sortedX,sortedY,'color',rand(1 ,3),'marker','*');
xlabel('x position');
ylabel('mean velocity');
legend(['mean velocity against position =' num2str(jj)]);
drawnow;

请先登录,再进行评论。

回答(1 个)

Guillaume
Guillaume 2019-3-13
If I understood correctly what you want, you basically want a plot for each unique y value which are the other variables against x. The easiest way to achieve this is:
  • create a function to plot the variables against x, ignoring y for now. That function therefore takes as input x, and the other variables. E.g (tailor as required):
function myplot(x, varargin) %saved in its own m file
%inputs:
% x: a possibly unsorted array of x coordinates. Will be sorted before plotting
% 4 more inputs (for now): mean velocity, std velocity, mean pd, std pd.
%all inputs are column vector as they come from a table
assert(numel(varargin) == 4, 'Only 4 variables expected');
[x, order] = sort(x);
plotvars = [varargin{:}]; %concatenate the other 4 vectors into a 4 column matrix
plotvars = plotvars(order, :); %and sort in the same order as x
plot(x, plotvars);
legend({'mean velocity', 'std velocity', 'mean pd', 'std pd'});
end
  • use rowfun to call the above function for each group of unique y:
rowfun(@myplot, thetable, 'GroupingVariables', 'ycoordinates', 'InputVariables', {'xcoordinates', 'mean_velocity', 'std_velocity', 'mean_pd', 'std_pd'}); %group by y. For each group, pass x and the other columns to the function
Done!
  11 个评论
Yannick Tabot Njami
Here is what i get :untitled.png
Yannick Tabot Njami
here is what i expect :dataplot.png

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Shifting and Sorting Matrices 的更多信息

标签

产品


版本

R2018b

Community Treasure Hunt

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

Start Hunting!

Translated by