Write a function called integerize that takes as its input a matrix A of integers of type double, and returns the name of the “smallest” signed integer class to which A can be converted without loss of information. If no such class exists, the text '
    9 Ansichten (letzte 30 Tage)
  
       Ältere Kommentare anzeigen
    
    Wasi von Deutschland
 am 26 Mai 2017
  
    
    
    
    
    Bearbeitet: Stephen23
      
      
 am 25 Aug. 2018
            function integerize(A)
  int8(A<2^7-1);
  int16(A<2^15-1);
 int32(A< 2^31-1);
int64(A<2^63-1);
end
3 Kommentare
  Stephen23
      
      
 am 26 Mai 2017
				For a change, zero is not really a special case. It could have the same class as one.
Akzeptierte Antwort
  Stephen23
      
      
 am 26 Mai 2017
        
      Bearbeitet: Stephen23
      
      
 am 29 Mai 2018
  
      Try something like this:
function typ = integerize(A)
if A >= intmin('int8') & A <= intmax('int8')
    typ = 'int8';
elseif A >= intmin('int16') & A <= intmax('int16')
    typ = 'int16';
elseif A >= intmin('int32') & A <= intmax('int32')
    typ = 'int32';
elseif A >= intmin('int64') & A <= intmax('int64')
    typ = 'int64';
else
    typ = 'NONE';
end
end
and tested:
>> integerize([128,127;-127,0])
ans = int16
Just for the sake of discussion, here is a function where the list of accepted classes are specified as an input argument (as long as the order from smallest to largest is kept):
function typ = integerize(A,C)
for k = 1:numel(C)
    typ = C{k};
    if A >= intmin(typ) & A <= intmax(typ)
      return
    end
end
typ = 'NONE';
end
and tested:
>> integerize(A,{'int8','int16','int32','int64'})
ans = int16
>> integerize(A,{'int8','int32','int64'})
ans = int32
>> integerize(A,{'int8','int64'})
ans = int64
>> integerize(A,{'int8'})
ans = NONE
0 Kommentare
Weitere Antworten (5)
  Guillermo Varela Carbajal
      
 am 7 Jun. 2017
        Trying to keep it simple, what about this:
function out = integerize (A)
if A==int8(A)
    out='int8';
elseif A==int16(A)
    out='int16';
elseif A==int32(A)
    out='int32';
elseif A==int64(A)
    out='int64';
else
    out='NONE';
end
2 Kommentare
  Jan
      
      
 am 26 Mai 2017
        
      Bearbeitet: Jan
      
      
 am 26 Mai 2017
  
      Get the largest elemt at first:
maxA = max(A(:));
Then use the logarithm to the base of 2 to determine the number of bits, which are required.
Finally some IF command let you create the output string 'int8', 'int16', 'int32' or 'int64'.
13 Kommentare
  Walter Roberson
      
      
 am 26 Mai 2017
				-128 fits in int8 but +128 is int16
[-1 0 23 -129 122] needs int16 because -129 does not fit in int8
  Jan
      
      
 am 26 Mai 2017
				
      Bearbeitet: Jan
      
      
 am 26 Mai 2017
  
			@Wasi: Do you see the problem? You check for < 127, but -129 is smaller than 127 also. Add this:
minA = min(A(:));
if maxA <= 127 && minA >= -128
Another hint to simplify the code:
if maxA<=2^7-1;
    x='int8';
elseif maxA <= 2^15-1 % This is not needed: && maxA>2^7-1
The case maxA <= 127 has been excluded before, then you do not have to check for > 127 anymore.
  Jorge Briceño
      
 am 9 Feb. 2018
        Hi,
Another answer would be like this:
function [ smallA ] = integerize( A )
minimum = min(A(:));
maximum = max(A(:));
if minimum >= -2^7 && maximum<=2^7-1
  smallA='int8';
elseif minimum >=-2^15 && maximum<=2^15-1
  smallA='int16';
elseif minimum >=-2^31 && maximum<=2^31-1
  smallA='int32';
elseif minimum >=-2^63 && maximum<=2^63-1
  smallA='int64';
else
  smallA='NONE';
end
0 Kommentare
  Erfan Pakdamanian
 am 28 Mai 2018
        
      Bearbeitet: Erfan Pakdamanian
 am 28 Mai 2018
  
      My algorithm may seem to have a little bit more lines than Stephen but it does pretty much the same thing with basic functions
function  s=integerize(A)
    [ii,jj]=size(A);
    y1=0;y2=0;y3=0; y4=0;
    for ii=1:ii
    for jj=1:jj
            if A(ii,jj)>= -128 && A(ii,jj)<= 127
      end   y1=y1+1;
            elseif  (A(ii,jj) <= -129 && A(ii,jj)>127) || (A(ii,jj)>= -32768 && A(ii,jj)<=32767)
                y2=y2+1;
            elseif (A(ii,jj) <-3276 && A(ii,jj)>32767) || (A(ii,jj)>= -(2)^31 && A(ii,jj)< 2^31)
                y3=y3+1;
            elseif (A(ii,jj) < -(2)^31 && A(ii,jj)>= 2^31) || (A(ii,jj)>= -(2)^63 && A(ii,jj)<= 2^63)
                y4=y4+1;
            else
                s='NONE';
                return;
            end
        end
    end
    if y4>0
        s='int64';
    elseif y4==0 && y3>0
        s='int32';
    elseif y4==0 && y3==0 && y2>0
        s='int16';
    else 
        s='int8';
    end
    end
1 Kommentar
  Walter Roberson
      
      
 am 28 Mai 2018
				
      Bearbeitet: Walter Roberson
      
      
 am 28 Mai 2018
  
			That "end" is out of place on the line after the first "if" statement.
The constant -3276 in the second "elseif" appears to be a typing mistake.
  Gurleen Singh
 am 25 Aug. 2018
        This is a bit simpler(but longer) code.
function c = integerize(A)
m = max(A(:));
n = min(A(:));
if n>=-128 && m<= 127 
    m = int8(m);
    n = int8(n);
    c = class(m);
    c =  class(n);
elseif n>=-2^15 && m<=2^15-1
    m = int16(m);
    n = int16(n);
    c = class(m);
    c =  class(n);
elseif n>=-2^31 && m<=2^31-1
    m = int32(m);
    n = int32(n);
    c = class(m);
    c =  class(n);
elseif n>=-2^63 && m<=2^63-1
    m = int64(m);
    n = int64(n);
    c = class(m);
    c =  class(n);
else
    c = 'NONE';
end
2 Kommentare
  Walter Roberson
      
      
 am 25 Aug. 2018
				Why are you writing to c twice for each case?
Why are you bothering to convert m and n to an explicit data type and then take class() of that data? Why not just assign 'int8' or whatever directly?
  Stephen23
      
      
 am 25 Aug. 2018
				
      Bearbeitet: Stephen23
      
      
 am 25 Aug. 2018
  
			Why call class twice within each if / elseif block, and yet throw away the answer for the first call?
If you already know the class (which you do, because you have explicitly written uint8, int16, etc.), then why call those four lines within each block? E.g. rather than this:
    m = int8(m); % <- look, you already use INT8!
    n = int8(n);
    c = class(m);
    c =  class(n);
you just need
c = 'int8'; % so why not just write 'INT8' ?
Siehe auch
Kategorien
				Mehr zu Annotations finden Sie in Help Center und File Exchange
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!
