Как узнать размер переменной в MATLAB - PullRequest
30 голосов
/ 31 января 2011

У меня есть переменные в MATLAB, я проверил их класс с помощью class(), но я также хочу знать размер, который они принимают в памяти.Точнее, я знаю, что они двойного типа, и я хочу убедиться, что они 32-битные двойные, а не 64-битные.

Используемая версия MATLAB - R2009b.

Ответы [ 4 ]

31 голосов
/ 31 января 2011

Вы можете использовать whos , чтобы получить массив структур, которые, помимо прочего, описывают размер в байтах каждой переменной.

Обратите внимание, что double по определению является 64-битным!

30 голосов
/ 31 января 2011

Я написал простую вспомогательную функцию для решения именно этой проблемы. Использование:

>> 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
11 голосов
/ 13 сентября 2013
dt=whos('VARIABLE_YOU_CARE_ABOUT'); MB=dt.bytes*9.53674e-7;  

Это даст вам размер в мегабайтах, например, МБ = 123,78

1 голос
/ 08 января 2015

Я попытался улучшить простую функцию MatlabSorter для решения этой проблемы.Использование по-прежнему:

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

дополнения:

1.Вы можете указать, какой тип возврата вы ищете - b, kb, mb, tb или pb

2.Вы можете получить результат в виде переменной, не печатая ее на экране

Вот код:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...