2011-01-30 136 views
27

我有MATLAB中的變量,我已經檢查他們的類使用class(),但我也想知道他們在內存中的大小。更準確地說,我知道它們是雙重類型的,我想確保它們是32位雙精度而不是64位。如何知道在MATLAB中的變量的大小

我使用的MATLAB版本是R2009b。

回答

29

您可以使用whos來獲取一組結構,其中描述了各個變量的大小(以字節爲單位)。

請注意,根據定義,double是64位!

27

我寫了一個簡單的便利函數來處理這個問題。用法是:

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

我跑R2007a,所以Java的問題對象不返回的大小可能已被固定在後續版本。下面的代碼:

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

非常有用的功能 – Saikat 2013-08-06 19:30:10

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

這會給你以MB爲單位的大小,例如MB = 123.78

1

我試圖提升「MatlabSorter的」簡單的函數來處理這個問題。用法仍然是相同的:

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

補充:

1.you能說出你尋求哪種類型的回報 - B,KB,MB,TB或PB

2.you可以得到結果作爲一個變量,但不打印屏幕

這裏上的代碼:

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 
相關問題