Convert space separated string table to cell?

5 views (last 30 days)
Hello :)
I can't seem to figure out how to convert a string table without using a (textscan etc.) loop,
from :
Table = ['A2 6C 33 04 00 81 00 80';'3F 11 65 01 0A '];
to :
Result = {'A2' '6C' '33' '04' '00' '81' '00' '80';'3F' '11' '65' '01' '0A' ' ' ' ' ' '};
Please note that "Table" is fixed-width Nx23 which could simplify things.
FYI, the end-goal is to convert from hex to decimal to cell-table:
Dec = [162 108 51 4 0 129 0 128; 63 17 101 1 10 0 0 0];
  1 Comment
José-Luis
José-Luis on 17 Jun 2014
Edited: José-Luis on 17 Jun 2014
Do you need to distinguish between a zero caused by a space and the string 00?

Sign in to comment.

Accepted Answer

Cedric
Cedric on 17 Jun 2014
Edited: Cedric on 17 Jun 2014
>> Dec = reshape( hex2dec( regexp( reshape( Table', 1, [] ), '..\s?', ...
'match' )), 8, [] )'
Dec =
162 108 51 4 0 129 0 128
63 17 101 1 10 0 0 0

More Answers (3)

Azzi Abdelmalek
Azzi Abdelmalek on 17 Jun 2014
Table = ['A2 6C 33 04 00 81 00 80';'3F 11 65 01 0A ']
Table(:,3:3:end)=[];
[n,m]=size(Table);
[bb,aa]=meshgrid(1:2:m,1:n);
out=arrayfun(@(x,y) hex2dec(Table(x,y:y+1)),aa,bb)
  3 Comments
Bjoern
Bjoern on 17 Jun 2014
Thank you soo much Azzi, very clever :)
However, even though I didn't explicitly mention it, I need it to be scalable. When I use a larger "Table" (60000x23 char) arrayfun takes a very long time to finish.
Instead, by passing a 60000x8 cell hex2dec is very fast. The problem is that I can't figure out how to construct the cell.
As reference, please try the below to see how much faster it is:
Cells = {'A2' '6C' '33' '04' '00' '81' '00' '80';'3F' '11' '65' '01' '0A' ' ' ' ' ' '};
Cells = repmat(Cells, 30000, 1); % Create large cell
out = uint8(hex2dec(Cells)); % Convert hex to dec
out = reshape(out, 60000, 8); % Reshape to desired shape
Azzi Abdelmalek
Azzi Abdelmalek on 17 Jun 2014
Table = ['A2 6C 33 04 00 81 00 80';'3F 11 65 01 0A ']
Table(:,3:3:end)=[];
[n,m]=size(Table);
[bb,aa]=meshgrid(1:2:m,1:n);
out=arrayfun(@(x,y) Table(x,y:y+1),aa,bb,'un',0)

Sign in to comment.


Andrei Bobrov
Andrei Bobrov on 17 Jun 2014
Edited: Andrei Bobrov on 17 Jun 2014
nn = size(Table,1);
a = cellfun(@(x)regexp(x,'\w*','match'), num2cell(Table,2),'un',0);
n = cellfun(@numel,a);
mm = max(n);
m = mm - n;
b = arrayfun(@(x)[hex2dec(a{x});zeros(m(x),1)]', (1:nn)','un',0);
out = cat(1,b{:});

Azzi Abdelmalek
Azzi Abdelmalek on 17 Jun 2014
Edited: Azzi Abdelmalek on 17 Jun 2014
Table = ['A2 6C 33 04 00 81 00 80';'3F 11 65 01 0A ']
[n,m]=size(Table)
Table(:,3:3:end)='/';
ss=regexp(num2cell(Table,2),'/+','split')
out=cellfun(@hex2dec,reshape([ss{:}],[],n)')
  2 Comments
Bjoern
Bjoern on 17 Jun 2014
Awesome, I really appreciate it!
Comparing this solution to Cedric Wannaz below, his is actually about 3 times faster so I will have to pick that one as "the answer". Thanks again!
Cedric
Cedric on 17 Jun 2014
Careful, "faster" is not always "better"! My solution assumes that you know a priori the max width in terms of number of columns.

Sign in to comment.

Products

Community Treasure Hunt

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

Start Hunting!