Splitting a matrix based on certain values in the rows
13 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Mr. 206
am 19 Feb. 2019
Kommentiert: Jos (10584)
am 20 Feb. 2019
I have a matrix A like this:
A = [911 911;
0 2;
8 5;
7 3;
911 911;
5 3;
1 6;
6 7;
911 911;
3 5;
8 4];
I want to split the matrix A into three matrices (A1,A2,A3) based on the row values 911 like this:
A1 = [0 2; 8 5; 7 3];
A2 = [5 3; 1 6; 6 7];
A3 = [3 5; 8 4];
I need to do this thing inside a for loop which will give the spitted matrix one after another.
3 Kommentare
Jan
am 19 Feb. 2019
@Atta: A,B,C, ... suffers from exactly the same problems as A1, A2, A3, ... With using a cell array and and index, the code is fast and flexibel. You can e.g. simply run it for 12'781'986 rows without getting mad while typing the code with manually hidden names of variables.
Akzeptierte Antwort
Stephen23
am 19 Feb. 2019
Bearbeitet: Stephen23
am 19 Feb. 2019
No loop required:
>> idx = cumsum(all(A==911,2));
>> row = 1:numel(idx);
>> fun = @(r){A(r(2:end),:)};
>> C = accumarray(idx,row(:),[],fun);
>> C{:}
ans =
0 2
8 5
7 3
ans =
5 3
1 6
6 7
ans =
3 5
8 4
4 Kommentare
Jos (10584)
am 20 Feb. 2019
% Pad each cell with rows of 911,
% so that it has the same number of rows as D
% using CELLFUN with an anonymous padding function using REPMAT
C2 = cellfun(@(m) [m ; repmat(911, size(D,1)-size(m,1),size(m,2))], C)
Weitere Antworten (1)
Jan
am 19 Feb. 2019
Bearbeitet: Jan
am 19 Feb. 2019
A = [911 911;
0 2;
8 5;
7 3;
911 911;
5 3;
1 6;
6 7;
911 911;
3 5;
8 4];
index = [find(A(:, 1) == 911); size(A, 1) + 1];
n = numel(index) - 1;
Result = cell(1, n);
for k = 1:n
Result{k} = A(index(k):index(k+1)-1, :); % [EDITED]
end
2 Kommentare
Jan
am 19 Feb. 2019
@Atta: Yes, I had a typo in my code. It is fixed now. Sometimes I expect the readers to fix bugs, when they are not too hard.
The result is a cell array and you access it as Result{1}. This is much smarter than hiding an index in the name of a variable.
Siehe auch
Kategorien
Mehr zu Matrices and Arrays finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!