Determine number of bytes per element under program control

26 vues (au cours des 30 derniers jours)
Daniel Lyddy
Daniel Lyddy le 2 Juil 2014
Commenté : Oliver Woodford le 13 Nov 2015
Does MATLAB have the equivalent of the C/C++ 'sizeof' function?
I have some code that can run on many numeric types, and I need to be able to calculate the number of bytes per element in a given numeric array, let's call it 'A'
bytesPerElement = sizeof(class(A));
I suppose I could do something like:
w = whos(A);
bytesPerElement = w.bytes / numel(A);
but I would be surprised if there was not a function that calculates the number of bytes per element directly from the variable class. I just can't seem to find that function ... entering the wrong words into the search engine, I suppose.

Réponses (2)

dpb
dpb le 3 Juil 2014
No sizeof directly that I know of, no. Wouldn't be hard to build one from isa, however.
An outline would be something otoo--
function bytes = sizeof(x)
% return size in bytes of numeric entity x
bytes = (isa(x,'double') | isa(x,'int8') | isa(x,'uint8'))*8 + ...
(isa(x,'single') | isa(x,'int4') | isa(x,'uint4'))*4 + ...
...
The rest should be obvious... :)
doc isa % for the various class choices
Some checking for invalid types would be good, of course...
  3 commentaires
dpb
dpb le 4 Juil 2014
I tend to forget about the command form for whos ... good thought; simpler than the isa route, indeed.
Oliver Woodford
Oliver Woodford le 13 Nov 2015
Uint8 means 8 bits, so only 1 byte. A switch on class(x) is another option.

Connectez-vous pour commenter.


James Tursa
James Tursa le 3 Juil 2014
There is a mex function for this, mxGetElementSize, but it doesn't do you much good at the m-file level:
Another way to do this assuming x is not empty (probably not any faster):
numel(typecast(x(1),'uint8'))
  2 commentaires
dpb
dpb le 4 Juil 2014
Wrap the mex-call in a mex-routine???
James Tursa
James Tursa le 5 Juil 2014
As requested:
#include "mex.h"
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
{
if( nrhs ) {
plhs[0] = mxCreateDoubleScalar(mxGetElementSize(prhs[0]));
}
}

Connectez-vous pour commenter.

Catégories

En savoir plus sur Write C Functions Callable from MATLAB (MEX Files) dans Help Center et File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by