Convert space separated string table to cell?

2 次查看(过去 30 天)
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 个评论
José-Luis
José-Luis 2014-6-17
编辑:José-Luis 2014-6-17
Do you need to distinguish between a zero caused by a space and the string 00?

请先登录,再进行评论。

采纳的回答

Cedric
Cedric 2014-6-17
编辑:Cedric 2014-6-17
>> 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

更多回答(3 个)

Azzi Abdelmalek
Azzi Abdelmalek 2014-6-17
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 个评论
Bjoern
Bjoern 2014-6-17
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 2014-6-17
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)

请先登录,再进行评论。


Andrei Bobrov
Andrei Bobrov 2014-6-17
编辑:Andrei Bobrov 2014-6-17
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 2014-6-17
编辑:Azzi Abdelmalek 2014-6-17
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 个评论
Bjoern
Bjoern 2014-6-17
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 2014-6-17
Careful, "faster" is not always "better"! My solution assumes that you know a priori the max width in terms of number of columns.

请先登录,再进行评论。

类别

Help CenterFile Exchange 中查找有关 Characters and Strings 的更多信息

产品

Community Treasure Hunt

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

Start Hunting!

Translated by