Index exceeds matrix dimensions

Hi, the script i am working on is:
a = {'not follow', 'we are not ready', 'dont call',...
'footpush not pressed', 'proximity selected', 'clear hoist',...
'stop loading', 'no sequence start'};
b = {'follow', 'we are ready', 'call', 'footpush pressed',...
'call DA selected', 'load hoist', 'load bag', 'sequence start'};
x = dec2bin(hex2dec('7F'));
for i = 0:7
if x(7 - i + 1) == '0'
disp(a{i+1})
else
disp(b{i+1});
end
end
My code works fine when the hex value entered is between '80' and 'FF' however when i enter hex values between '00' and '7F' i get an error saying:
Index exceeds matrix dimensions.
Error in script (line 8)
if x(7 - i + 1) == '0'
Any help is much appreciated.

 Respuesta aceptada

Cedric
Cedric el 1 de Mzo. de 2013
Editada: Cedric el 1 de Mzo. de 2013

0 votos

When your hex code is below 0x80, the length of the string that you get with DEC2BIN is smaller than 8 chars.
Try with that:
x = hex2dec('7F') ;
for k = 1 : 8
if bitand(x, 2^(8-k))
disp(b{k}) ;
else
disp(a{k}) ;
end
end
Cheers,
Cedric

5 comentarios

Darren
Darren el 1 de Mzo. de 2013
That returns the following error:
Undefined function 'bitand' for input arguments of type 'char'.
Cedric
Cedric el 1 de Mzo. de 2013
Editada: Cedric el 1 de Mzo. de 2013
You certainly forgot to remove the call to DEC2BIN.
Darren
Darren el 1 de Mzo. de 2013
Thanks very much Cedric! However, i don't understand how the code can work without doing a dec2bin conversion...can you explain please?
Cedric
Cedric el 1 de Mzo. de 2013
Editada: Cedric el 1 de Mzo. de 2013
You're most welcome! DEC2BIN actually returns a string that is a representation of the binary code that corresponds to its argument; it is just for display purpose (or string processing) as its elements are chars '0' and '1' (which is what appears in your test). Now what I test is the value of each bit (within the first 8 bits) of the binary code that represents the decimal number outputted by HEX2DEC. I do this by performing an AND binary operation with 2^p. The latter generates 2^0=1d=00000001b, 2^1=2d=00000010b, 2^2=4d=00000100d, .., 2^7=128d=10000000b, for p =0,..,7 (in your case, p=8-k). You can see that bits with a 0 value will mask any bit value of the other operand in the binary AND operation, so the output of BITAND will be different from 0 only when bit number p is 1. Try the mechanism "by hand" to see how it works, e.g with decimal 9 whose 8 bits binary representation (as unsigned int) is 00001001:
>> x = 9 ;
>> bitand(x, 2^0) % Least significant bit (LSB).
ans =
1
>> bitand(x, 2^1)
ans =
0
>> bitand(x, 2^2)
ans =
0
>> bitand(x, 2^3)
ans =
8
So testing whether the output of BITAND is 0 or not provides you with the information about each bit value.
>> bitand(x, 2.^(7:-1:0)) ~= 0
ans =
0 0 0 0 1 0 0 1
Hope it helps!
Darren
Darren el 1 de Mzo. de 2013
Thanks very much, appreciated!

Iniciar sesión para comentar.

Más respuestas (0)

Preguntada:

el 1 de Mzo. de 2013

Community Treasure Hunt

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

Start Hunting!

Translated by