Convert space separated string table to cell?

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 个评论

Do you need to distinguish between a zero caused by a space and the string 00?

请先登录,再进行评论。

 采纳的回答

>> 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 个)

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 个评论

Very clever, Azzi...I was trying to puzzle out how to get the indices for arrayfun-- meshgrid never crossed my mind here.
Had added the trailing blank to regularize the array; was thinking if could linearize then reshape back and decided to refresh as somebody was bound to have had the bright idea...
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
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)

请先登录,再进行评论。

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{:});
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 个评论

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!
Careful, "faster" is not always "better"! My solution assumes that you know a priori the max width in terms of number of columns.

请先登录,再进行评论。

类别

帮助中心File 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