2011-01-30 16 views
27

Tengo variables en MATLAB, he comprobado su clase usando class() pero también quiero saber el tamaño que toman en la memoria. Más exactamente, sé que son de tipo doble, y quiero asegurarme de que sean dobles de 32 bits y no de 64 bits.Cómo saber el tamaño de una variable en MATLAB

La versión de MATLAB que estoy usando es R2009b.

Respuesta

29

Puede usar whos para obtener una matriz de estructuras que describen, entre otras cosas, el tamaño en bytes de cada variable.

¡Tenga en cuenta que un doble es, por definición, de 64 bits!

27

Escribí una función de conveniencia simple para manejar solo este problema. El uso es:

>> x = ones(1000); 
>> ByteSize(x) 
7.63 Mb 

corro R2007a, por lo que el problema de los objetos Java no regresan tamaños pueden haber corregido en versiones posteriores. Aquí está el código:

function ByteSize(in, fid) 
% BYTESIZE writes the memory usage of the provide variable to the given file 
% identifier. Output is written to screen if fid is 1, empty or not provided. 

if nargin == 1 || isempty(fid) 
    fid = 1; 
end 

s = whos('in'); 
fprintf(fid,[Bytes2str(s.bytes) '\n']); 
end 

function str = Bytes2str(NumBytes) 
% BYTES2STR Private function to take integer bytes and convert it to 
% scale-appropriate size. 

scale = floor(log(NumBytes)/log(1024)); 
switch scale 
    case 0 
     str = [sprintf('%.0f',NumBytes) ' b']; 
    case 1 
     str = [sprintf('%.2f',NumBytes/(1024)) ' kb']; 
    case 2 
     str = [sprintf('%.2f',NumBytes/(1024^2)) ' Mb']; 
    case 3 
     str = [sprintf('%.2f',NumBytes/(1024^3)) ' Gb']; 
    case 4 
     str = [sprintf('%.2f',NumBytes/(1024^4)) ' Tb']; 
    case -inf 
     % Size occasionally returned as zero (eg some Java objects). 
     str = 'Not Available'; 
    otherwise 
     str = 'Over a petabyte!!!'; 
end 
end 
+0

función muy útil – Saikat

9
dt=whos('VARIABLE_YOU_CARE_ABOUT'); MB=dt.bytes*9.53674e-7; 

esto le dará el tamaño en megabytes, por ejemplo, MB = 123.78

1

Me trataron de mejorar la función de simple 'de MatlabSorter' para manejar este problema. Uso sigue siendo el mismo:

>> x = ones(1000); 
>> getByteSize(x) 
7.63 mb 

adiciones:

1.you puede afirmar qué tipo de retorno de la que buscan para - b, KB, MB, tb o Pb

2.you puede conseguir el resultado como una variable sin imprimirlo en la pantalla

Aquí está el código:

function b = getByteSize(theVariable, returnType, fid) 
% getByteSize returns the mem.usage of the provided variable(theVariable) to the given file 
% identifier. 
% returnType is assigned meaningfully according to the byte size if not stated 
% Output is written to screen if fid is 1, empty or not provided. 
s = whos('theVariable'); 
b = s.bytes; 
if nargin == 1 || isempty(returnType) 
    scale = floor(log(b)/log(1024)); 
    switch scale 
     case 0 
      returnType = 'byte'; 
     case 1 
      returnType = 'kb'; 
     case 2 
      returnType = 'mb'; 
     case 3 
      returnType = 'gb'; 
     case 4 
      returnType = 'tb'; 
     case -inf 
      % Size occasionally returned as zero (eg some Java objects). 
      returnType = 'byte'; 
      warning('Size occasionally returned as zero (eg some Java objects). Bytes assumed'); 
     otherwise 
      returnType = 'petabytes'; 
      warning('Over 1024 petabyte. petabytes assumed'); 
    end 
end 
switch returnType 
    case {'b','byte','bytes'} 
     b = s.bytes; 
    case {'kb','kbs','kilobyte','kilobytes'} 
     b = b/1024; 
    case {'mb','mbs','megabyte','megabytes'} 
     b = b/1024^2; 
    case {'gb','gbs','gigabyte','gigabytes'} 
     b = b/1024^3; 
    case {'tb','tbs','terabyte','terabytes'} 
     b = b/1024^4; 
    case {'pb','pbs','petabyte','petabytes'} 
     b = b/1024^5; 
    otherwise 
     returnType = 'bytes'; 
end 
if nargin <= 2 || isempty(fid) || fid == 1 
    fprintf(1,[num2str(b) ' ' returnType '\n']); 
elseif nargin > 2 && ~isempty(fid) && fid > 2 
    try 
     fprintf(fid,[num2str(b) ' ' returnType '\n']); 
    catch 
     warning(['fid(' num2str(fid) ') could not be edited. Hence the output will be written on the screen.']); 
     fprintf(1,[num2str(b) ' ' returnType '\n']); 
    end 
end 
end 
Cuestiones relacionadas