2011-01-30 13 views
27

ho variabili in MATLAB, ho controllato la loro classe utilizzando class() ma voglio anche conoscere la dimensione che prendono in memoria. Più precisamente, so che sono di tipo doppio e voglio assicurarmi che siano a 32 bit double e non a 64 bit.Come conoscere la dimensione di una variabile in MATLAB

La versione del MATLAB che sto utilizzando è R2009b.

risposta

29

È possibile utilizzare whos per ottenere una matrice di strutture che descrivono, tra le altre cose, la dimensione in byte di ciascuna variabile.

Si noti che un doppio è, per definizione, 64 bit!

27

Ho scritto una semplice funzione di convenienza per gestire solo questo problema. L'uso è:

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

corro R2007a, quindi il problema di Java oggetti non formati ritorno potrebbe essere stato risolto nelle release successive. Ecco il codice:

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

funzione molto utile – Saikat

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

questo vi darà la dimensione in megabyte, ad esempio MB = 123.78

1

ho cercato di migliorare la funzione semplice 'di MatlabSorter' per gestire questo problema. L'uso è sempre la stessa:

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

aggiunte:

1.you può affermare che tipo di rendimento che cercate per - b, KB, MB, la tubercolosi o pb

2.you può ottenere il risultato come variabile senza stamparlo sullo schermo

Ecco il codice:

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 
Problemi correlati