Sort Cell Array after accumarray function

1 回表示 (過去 30 日間)
MakM
MakM 2022 年 12 月 26 日
コメント済み: MakM 2022 年 12 月 27 日
I have following code;
row_f=({0;0;0;1;2;3;4;0});
row_s=({'a';'a';'b';'b';'c';'c';'a';'b'});
t={'12/09/2022 04:28:01 PM';'12/09/2022 04:28:02 PM';'12/09/2022 03:28:03 PM';'12/09/2022 03:28:04 PM';'12/09/2022 02:28:05 PM';'12/09/2022 02:28:06 PM';'12/09/2022 04:28:03 PM';'12/09/2022 03:28:05 PM'};
all=[row_f, row_s,t];
[~,~,X] = unique(all(:,2));
dataset= accumarray(X,1:size(all,1),[],@(r){all(r,:)})
dataset = 3×1 cell array
{3×3 cell} {3×3 cell} {2×3 cell}
disp(dataset{1,1});
{[0]} {'a'} {'12/09/2022 04:28:01 PM'} {[0]} {'a'} {'12/09/2022 04:28:02 PM'} {[4]} {'a'} {'12/09/2022 04:28:03 PM'}
disp(dataset{2,1});
{[0]} {'b'} {'12/09/2022 03:28:03 PM'} {[1]} {'b'} {'12/09/2022 03:28:04 PM'} {[0]} {'b'} {'12/09/2022 03:28:05 PM'}
disp(dataset{3,1});
{[2]} {'c'} {'12/09/2022 02:28:05 PM'} {[3]} {'c'} {'12/09/2022 02:28:06 PM'}
If we see the timestamp in the third column, timestamp in the first cell (dataset{1,1}) is greater than dataset{2,1} and dataset{3,1}; How do I sort the timestamp acc to ascending order after accumarray function so I can have the new dataset cell values as dataset{3,1} in the first cell because its timestamp is smaller. then dataset{2,1} in the second row cell and finally the datatset{1,1} in the thirst row cell.
like the new value for the dataset would be:
dataset = 3x1 cell array
{2x3 cell}
{3x3 cell}
{3x3 cell}
  1 件のコメント
Matt J
Matt J 2022 年 12 月 26 日
編集済み: Matt J 2022 年 12 月 26 日
If, as in your example, the time stamp is always the same for a given alphabetic label in column 2, it is not clear why you need both.
If they are not always the same, it is not clear how you want them sorted in that case.

サインインしてコメントする。

採用された回答

Matt J
Matt J 2022 年 12 月 26 日
編集済み: Matt J 2022 年 12 月 26 日
row_f=[0;0;0;1;2;3;4;0];
row_s=({'a';'a';'b';'b';'c';'c';'a';'b'});
t={'12/09/2022 04:28:01 PM';'12/09/2022 04:28:02 PM';'12/09/2022 03:28:03 PM';'12/09/2022 03:28:04 PM';'12/09/2022 02:28:05 PM';'12/09/2022 02:28:06 PM';'12/09/2022 04:28:03 PM';'12/09/2022 03:28:05 PM'};
T=sortrows( table(row_f(:), row_s(:),t(:)) , [3,2]);
[~,~,id]=unique(T{:,2},'stable');
dataset=splitapply(@(x){x},table2cell(T),id); dataset{:}
ans = 2×3 cell array
{[2]} {'c'} {'12/09/2022 02:28:05 PM'} {[3]} {'c'} {'12/09/2022 02:28:06 PM'}
ans = 3×3 cell array
{[0]} {'b'} {'12/09/2022 03:28:03 PM'} {[1]} {'b'} {'12/09/2022 03:28:04 PM'} {[0]} {'b'} {'12/09/2022 03:28:05 PM'}
ans = 3×3 cell array
{[0]} {'a'} {'12/09/2022 04:28:01 PM'} {[0]} {'a'} {'12/09/2022 04:28:02 PM'} {[4]} {'a'} {'12/09/2022 04:28:03 PM'}

その他の回答 (1 件)

the cyclist
the cyclist 2022 年 12 月 26 日
編集済み: the cyclist 2022 年 12 月 26 日
Here is one way:
% Your code
row_f=({0;0;0;1;2;3;4;0});
row_s=({'a';'a';'b';'b';'c';'c';'a';'b'});
t={'12/09/2022 04:28:01 PM';'12/09/2022 04:28:02 PM';'12/09/2022 03:28:03 PM';'12/09/2022 03:28:04 PM';'12/09/2022 02:28:05 PM';'12/09/2022 02:28:06 PM';'12/09/2022 04:28:03 PM';'12/09/2022 03:28:05 PM'};
all=[row_f, row_s,t];
[~,~,X] = unique(all(:,2));
dataset= accumarray(X,1:size(all,1),[],@(r){all(r,:)})
dataset = 3×1 cell array
{3×3 cell} {3×3 cell} {2×3 cell}
% Sort it
[~,sortIndex] = sort(cellfun(@(x)x(1,end),dataset));
datasetSorted = dataset(sortIndex,:)
datasetSorted = 3×1 cell array
{2×3 cell} {3×3 cell} {3×3 cell}
  1 件のコメント
MakM
MakM 2022 年 12 月 27 日
Thanks cyclist for the answer, it worked too

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeShifting and Sorting Matrices についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by