2016-08-23 2 views
2

У меня есть 5 строк (HEX), которые выглядят следующим образом:добывающие колонны по одному из нескольких строк в MATLAB

a = 40 C0 70 EB; 
b = 40 C0 80 94; 
c = 40 C0 90 59; 
d = 40 C0 A0 13; 
e = 40 C0 B0 DE 

Мне нужно извлечь каждую колонку (вертикальные значения), начиная с последнего затем сохранить его в строку, а затем преобразовать ее в эквивалентную двоичную. Надеюсь, что приведенный ниже рисунок дает четкую картину.

enter image description here

Я был в состоянии преобразовать данный гекс в двоичные значения горизонтально по одному за раз, но теперь я хотел бы, чтобы извлечь их вертикально, а затем преобразовать их в двоичный формат. Код, который я написал следующим образом,

Data = '40 C0 70 EB';   
str = regexp(Data,' ','split'); 
Ind = cellfun(@length,str); 
str=str(Ind==2); 
%Hex to Binary 
bin = hexToBinaryVector(str,8,'MSBFirst'); 

Желаемый результат: Когда значения в первом столбце (вход) извлекаются они должны быть преобразованы в двоичное и хранится в виде массива (выход) , Например, для 1-го столбца (красный) мы имеем значения «EB 94 59 13 DE», его эквивалентный двоичный код равен ['1001 0100' '1001 0101' '1001 0110' '1001 0111' '1001 1000' '1001 1001'] , Поэтому все эти двоичные значения должны храниться как массив под одной переменной. Аналогичным образом, другие должны также храниться как массив под разными переменными.

+0

Вопрос, как представляется, хорошо объяснен, но я не могу понять, что вы хотите ,,, Можете ли вы предоставить ввод и желаемый результат в виде обычного текста? –

+1

Не 'regexp (данные, '', 'split');' делать то же самое, что 'strsplit (Data)'? – Adriaan

ответ

0

Вот способ сделать это:

s = {a; b; c; d; e}; % Collect into cell array 
s = cellfun(@strsplit, s, 'UniformOutput', false); % split each string by space 
s = vertcat(s{:}); % arrange as 2D-cell array of strings 
s = fliplr(s); % reverse horizontally. Last column becomes first 
y = dec2bin(hex2dec(s), 8); % convert each string (in linear order) to binary 
y = mat2cell(y, repmat(size(s,1),1,size(s,2))); % split results into a cell array 

Результатом является массив ячеек 2D-символьных массивов из нулей и единиц. В вашем примере это дает

y{1} = 
11101011 
10010100 
01011001 
00010011 
11011110 
... 
y{4} = 
01000000 
01000000 
01000000 
01000000 
01000000 
+0

Благодарим вас за ответ. Не могли бы вы вкратце объяснить, что означает последние две строки вашего кода. В частности, тот, у которого y = dec2bin (hex2dec (s), 8); Он работает отлично, но зачем использовать dec2bin, когда нет десятичного значения. Все в шестнадцатеричном виде. – user161816

+0

@Sagar Вам понадобится нечто вроде 'hex2bin'. Поскольку этого не существует, я использую 'hex2dec', за которым следует' dec2bin'. Это дает все результаты в массиве с 8 столбцами, где каждая строка является двоичным числом. Последняя строка делится на группы из 5 строк (где «5» - количество исходных переменных) –

0

В знаменитых словах Марка Твена:

«У меня не было времени, чтобы написать короткое письмо код, так что я написал один длинный вместо этого.»

Вы можете комбинировать эти функции с меньшим количеством функций, но таким образом легко увидеть, что делает каждая из линий. Например, вам не нужны как g, так и h. Кроме того, вы выбрали более описательные имена, чем те, которые я использовал в своем коде!

У меня нет инструмента сбора данных, поэтому я должен сделать dec2bin(hex2dec(hexa)). К счастью для вас, вы можете пропустить функцию! =)

a = '40 C0 70 EB'; b = '40 C0 80 94'; c = '40 C0 90 59'; d = '40 C0 A0 13'; e = '40 C0 B0 DE'; 
cell_block = {a;b;c;d;e} 
cell_block = 
    '40 C0 70 EB' 
    '40 C0 80 94' 
    '40 C0 90 59' 
    '40 C0 A0 13' 
    '40 C0 B0 DE' 

f = @(x) cellfun(@strsplit, x, 'UniformOutput', false); 
g = @(x) cellfun(@hex2dec, x, 'UniformOutput', false).'; 
h = @(x) cellfun(@dec2bin, x, 'UniformOutput', false); 
cells_of_binary_values = h(g(f(cell_block))); 
arrayfun(@(ii) reshape(cells_of_binary_values{ii}.', 1, []), ... 
     1:numel(cells_of_binary_values),'UniformOutput',0) 

ans = 
{ 
    [1,1] = 01000000110000000111000011101011 
    [1,2] = 01000000110000001000000010010100 
    [1,3] = 01000000110000001001000001011001 
    [1,4] = 01000000110000001010000000010011 
    [1,5] = 01000000110000001011000011011110 
Смежные вопросы