How may I split a matrix into two based on 0/1 of the first column?
3 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
Julia
am 11 Feb. 2023
Kommentiert: Dyuman Joshi
am 12 Feb. 2023
M = [0 1 3
0 2 2
0 3 5
1 1 4
1 2 9
1 3 8
1 4 5
1 5 3
0 1 2
0 2 1
1 1 7
1 2 6
1 3 3
1 4 8
0 1 7
0 2 4
0 3 7];
Hi! Say I have this matrix M, and I want to make two matrices based on M. M0 is the part of M where the first column is 0, and M1 is where the first column is 1. M0 and M1 should look like this:
M0 = [1 3
2 2
3 5
1 2
2 1
1 7
2 4
3 7];
M1 = [1 4
2 9
3 8
4 5
5 3
1 7
2 6
3 3
4 8]
Could someone please tell me how to get M0 and M1? Thanks a lot!
0 Kommentare
Akzeptierte Antwort
the cyclist
am 11 Feb. 2023
Bearbeitet: the cyclist
am 11 Feb. 2023
M = [0 1 3
0 2 2
0 3 5
1 1 4
1 2 9
1 3 8
1 4 5
1 5 3
0 1 2
0 2 1
1 1 7
1 2 6
1 3 3
1 4 8
0 1 7
0 2 4
0 3 7];
M1 = M(M(:,1)==0,2:3)
M2 = M(M(:,1)==1,2:3)
6 Kommentare
Walter Roberson
am 11 Feb. 2023
In my opinion, your variables M0 and M1 were named very directly: M0 being associated with condition 0, and M1 being associated with condition 1. For such a small number of variables, I think this is pretty clear and not harmful at all.
But on the other hand, using M1 and M2 gets into the territory of using numbered variables. "First M" and "Second M". Those do not give any useful information to the readers about what they mean, and if you are going to use that then it probably makes more sense in program construction to use a cell array M{1} M{2}
I am not as against "encoding data in the variable name" as some of the volunteers are. For example, as far as I am concerned,
R = Img(:,:,1);
G = Img(:,:,2);
B = Img(:,:,3);
can be classified as "encoding data in the variable name".
The boundary between acceptable and not recommended is a bit fuzzy for me. Names that directly tell what they are talking about are generally welcome, but if you get "too many" of them then there is probably a better arrangement.
For example you might have reason to group data according to three bits, and in such a case using variable names M000 M001 M010 M011 M100 M101 M110 M111 would be direct representation and probably reasonable to work with. But if you needed to use (for example) 8 bits, M00000000 M00000001 through M11111111 then that is probably too much. At the moment I feel as if 4 bits, M0000 through M1111 would be about the upper reasonable limit (unless machine coding was being used); I might feel differently later.
Weitere Antworten (1)
John D'Errico
am 11 Feb. 2023
If you will split it into only two matrices, then use named variables as you wish. If you wanted to split it into multiple parts, based on that first index, I would split it into a cell array.
M = [0 1 3
0 2 2
0 3 5
1 1 4
1 2 9
1 3 8
1 4 5
1 5 3
0 1 2
0 2 1
1 1 7
1 2 6
1 3 3
1 4 8
0 1 7
0 2 4
0 3 7];
M0 = M(M(:,1) == 0,2:3)
M1 = M(M(:,1) == 1,2:3)
2 Kommentare
Dyuman Joshi
am 12 Feb. 2023
Suppose you have to calculate M0, M1, M2, ..., M8.
You can do it like above, calculating each variable individually. That is not recommended. You can find the reasoning as to why not, in the link mentioned @the cyclist's answer.
Instead one should use indexing and store the results in cell array as John mentioned above.
Why Cell arrays you might ask?
Because corresponding to every index, the size of each resultant matrix might be different and cell arrays are perfect to store such data.
%modified data
M = [0 1 3;
8 2 2
2 3 5
4 1 4
3 2 9
7 3 8
5 4 5
1 5 3
5 1 2
0 2 1
8 1 7
1 2 6
6 3 3
2 4 8
4 1 7
6 2 4
0 3 7];
%0 to 8, 9 numbers
n=9;
%pre-allocation to boost up speed for large calculations
out=cell(1,n);
%using loop to index
for k=1:n
idx=M(:,1)==(k-1);
out{k}=M(idx,2:end);
end
%here out{1} will correspond to M0, out{2} to M1, out{9} to M8
%as indexing in MATLAB starts with 1
out
out{1} %M0 - 1st, 10th and last row
out{4} %M3 - 5th row
out{7} %M6 - 13th and 16th row
As I mentioned above, you can see that the size of these cell elements are different.
Indexing is simple, not just to read or write, but to implement as well and incredibly efficient.
Siehe auch
Kategorien
Mehr zu Logical 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!