split matrix in diffrent sizes matrixes according to indicies vector

2 次查看(过去 30 天)
I have a matrix A (7x2) and a vector B. B represents the row indicies, where i want the matrix A to be sprlit.
e.g.
A = [2 6; 4 3; 3 3; 2 8; 9 1; 3 4; 7 5] B=[2; 3; 6]
output should be
A1 = [2 6; 4 3]
A2 = [3 3]
A3 = [2 8; 9 1; 3 4]
A4 = [7 5]
Do you have an idea how it could be done?
Thank you for help.

采纳的回答

Stephen23
Stephen23 2019-9-25
编辑:Stephen23 2019-9-25
Do NOT create numbered variables. Indexing is simpler and much more efficient.
You can use mat2cell to split the matrix up into a cell array:
>> R = diff([0;B;size(A,1)]);
>> C = mat2cell(A,R,2);
>> C{:}
ans =
2 6
4 3
ans =
3 3
ans =
2 8
9 1
3 4
ans =
7 5
and then you can trivially access the contents of that cell array using indexing:
E.g.:
>> C{2}
ans =
3 3
>> C{3}
ans =
2 8
9 1
3 4
  3 个评论
Stephen23
Stephen23 2019-9-26
编辑:Stephen23 2019-9-26
"I want to add a third row to each cell ..."
This is confusing, because in your example you are adding a third column, not a row. Remember that matrices are defined by rows*columns, and this is how MATLAB indexing works too: (rows,columns,pages,...)
In any case, you can simply use a loop, e.g.:
for k = 1:numel(C)
C{k}(:,3) = cumsum(C{k}(:,2));
end
Giving:
>> C{:}
ans =
2 6 6
4 3 9
ans =
3 3 3
ans =
2 8 8
9 1 9
3 4 13
ans =
7 5 5
Or, if you really want to use cellfun, something like this:
>> F = @(m)[m,cumsum(m(:,2))];
>> C = cellfun(F,C,'uni',0);
>> C{:}
ans =
2 6 6
4 3 9
ans =
3 3 3
ans =
2 8 8
9 1 9
3 4 13
ans =
7 5 5

请先登录,再进行评论。

更多回答(1 个)

the cyclist
the cyclist 2019-9-25
Stephen's solution is better, but I thought I would post this for loop version, which might be a bit clearer to you on what is happening:
A = [2 6;
4 3;
3 3;
2 8;
9 1;
3 4;
7 5];
B=[2; 3; 6];
C = [0; B; size(A,1)];
for nj = 1:numel(C)-1
An{nj} = A(C(nj)+1:C(nj+1),:);
end
I would also advocate using cell arrays rather than dynamically named variables.

类别

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

Community Treasure Hunt

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

Start Hunting!

Translated by