funcion - Cómo saber el tamaño de una variable en MATLAB
sum matlab (4)
Escribí una función de conveniencia simple para manejar solo este problema. El uso es:
>> x = ones(1000);
>> ByteSize(x)
7.63 Mb
Ejecuto R2007a, por lo que el problema de los objetos de Java que no devuelven los tamaños puede haberse solucionado 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
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.
La versión de MATLAB que estoy usando es R2009b.
Puede usar whos para obtener una matriz de estructuras que describan, entre otras cosas, el tamaño en bytes de cada variable.
Tenga en cuenta que un doble es, por definición, de 64 bits!
Traté de mejorar la función simple ''MatlabSorter'' para manejar este problema. El uso sigue siendo el mismo:
>> x = ones(1000);
>> getByteSize(x)
7.63 mb
adiciones:
1. puede indicar qué tipo de retorno busca: b, kb, mb, tb o pb
2. puede obtener 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
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