Reshaping a Char Array
Mostra commenti meno recenti
Hi,
I am currently working on a Project where I need to order a Char Array like shown below
A = ['12';'12';'12';'12';'12';'12';'12';'12';'34';'34';'34';'34';'34';'34';'34';'34';'56';'56';'56';'56';'56';'56';'56';'56';'78';'78';'78';'78';'78';'78';'78';'78';'AA';'AA';'AA';'AA';'AA';'AA';'AA';'AA';'BB';'BB';'BB';'BB';'BB';'BB';'BB';'BB';'CC';'CC';'CC';'CC';'CC';'CC';'CC';'CC';'DD';'DD';'DD';'DD';'DD';'DD';'DD';'DD'];
I want to re-arrange the char array like:
'1234'
'1234'
'1234'
'1234'
'1234'
'1234'
'1234'
'1234'
'5678'
'5678'
'5678'
'5678'
'5678'
'5678'
'5678'
'5678'
'AABB'
'AABB'
'AABB'
'AABB'
'AABB'
'AABB'
'AABB'
'AABB'
'CCDD'
'CCDD'
'CCDD'
'CCDD'
'CCDD'
'CCDD'
'CCDD'
'CCDD'
What is the best way to do that? I tried using reshape function but it doesn't seem to work for this case?
Thanks in advance.
Risposta accettata
Più risposte (1)
Ameer Hamza
il 16 Ott 2020
Something like this
A = ['12';'12';'12';'12';'12';'12';'12';'12';'34';'34';'34';'34';'34';'34';'34';'34';'56';'56';'56';'56';'56';'56';'56';'56';'78';'78';'78';'78';'78';'78';'78';'78';'AA';'AA';'AA';'AA';'AA';'AA';'AA';'AA';'BB';'BB';'BB';'BB';'BB';'BB';'BB';'BB';'CC';'CC';'CC';'CC';'CC';'CC';'CC';'CC';'DD';'DD';'DD';'DD';'DD';'DD';'DD';'DD'];
idx = find([1; diff(A(:,1))]);
B = reshape(string(A), diff(idx(1:2)), []);
B = B(:,1:2:end) + B(:,2:2:end);
B = char(B(:));
6 Commenti
Rik
il 16 Ott 2020
Ah, you must have posted this just before I refreshed the page. Interesting to see a different strategy.
Ameer Hamza
il 16 Ott 2020
Interestingly another question today had a somewhat common structure: https://www.mathworks.com/matlabcentral/answers/615958-how-to-create-arrays-from-repeated-matrix-raws#answer_515683?s_tid=prof_contriblnk, so writing this answer just required a bit of modification.
Jack Gallahan
il 16 Ott 2020
Rik
il 16 Ott 2020
Have you seen my answer below? This answer can also be modified for such cases, but mine would have an obvious parameter to edit.
Ameer Hamza
il 17 Ott 2020
It appears to be working in that case too
A = [repmat('12', 256, 1); repmat('34', 256, 1); repmat('56', 256, 1); repmat('78', 256, 1); repmat('AA', 256, 1); repmat('BB', 256, 1); repmat('CC', 256, 1); repmat('DD', 256, 1)];
idx = find([1; diff(A(:,1))]);
B = reshape(string(A), diff(idx(1:2)), []);
B = B(:,1:2:end) + B(:,2:2:end);
B = char(B(:));
The only case it will fail is if the second letter changes and the first letter remain same, for example
A = ['12';'12';'14';'14';'56';'56';'78';'78';'AA';'AA';'BB';'BB';'CC';'CC';'DD';'DD'];
In that case, following modification
idx = find([1; any(diff(A),2)]);
works, which is a more general form of the line in my answer and work for the original input too.
Jack Gallahan
il 17 Ott 2020
Modificato: Jack Gallahan
il 17 Ott 2020
Categorie
Scopri di più su Resizing and Reshaping Matrices in Centro assistenza e File Exchange
Prodotti
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!