Working with cell arrays

2 次查看(过去 30 天)
L'O.G.
L'O.G. 2023-5-5
评论: Stephen23 2023-5-8
I would like to separate columns in an array based on the unique values of the first column. I think the way to do this is a cell array since the vectors would be of different length. Is there a way to vectorize this? For example, the following array
example = [
5 2.3 1.7
5 0.2 9.1
99 3.3 3.6
99 4.1 3.2
99 5.1 2.2
103 1.1 6.8
];
should give
A{1} = [2.3,0.2];
A{2} = [3.3,4.1,5.1];
A{3} = [1.1];
B{1} = [1.7,9.1];
B{2} = [3.6,3.2,2.2];
B{3} = [6.8];
(since there are three unique values in column 1 of the example)

采纳的回答

Paul
Paul 2023-5-5
example = [
5 2.3 1.7
5 0.2 9.1
99 3.3 3.6
99 4.1 3.2
99 5.1 2.2
103 1.1 6.8
];
G = findgroups(example(:,1));
A = splitapply(@(x) mat2cell(x,numel(x)),example(:,2),G);
B = splitapply(@(x) mat2cell(x,numel(x)),example(:,3),G);
A,B
A = 3×1 cell array
{2×1 double} {3×1 double} {[ 1.1000]}
B = 3×1 cell array
{2×1 double} {3×1 double} {[ 6.8000]}
A{1}
ans = 2×1
2.3000 0.2000
B{1}
ans = 2×1
1.7000 9.1000
  1 个评论
Stephen23
Stephen23 2023-5-8
Also without the MAT2CELL call:
X = [
5 2.3 1.7
5 0.2 9.1
99 3.3 3.6
99 4.1 3.2
99 5.1 2.2
103 1.1 6.8
];
G = findgroups(X(:,1));
A = accumarray(G,X(:,2),[],@(a){a});
B = accumarray(G,X(:,3),[],@(a){a});
A,B
A = 3×1 cell array
{2×1 double} {3×1 double} {[ 1.1000]}
B = 3×1 cell array
{2×1 double} {3×1 double} {[ 6.8000]}
A{1}
ans = 2×1
2.3000 0.2000
B{1}
ans = 2×1
1.7000 9.1000

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!

Translated by