matlab - Recognizing a cell input in one line -
consider following function inputs
>> b.a = 1 b = a: 1 >> c = {'this' 'cell'} c = 'this' 'cell' >> d = [1 2 3] d = 1 2 3
the input can called in many ways example testfunction(b,d,c)
testfunction(d,c,b)
etc want cell input , retrieve data it
function testfunction(varargin) =1:numel(varargin) if(iscell(varargin{i})) fprintf('the input number %d cell!\n',i) end end
which recognizes if variable input cell there elegant way ? because iscell
doesnt return index , used class()
returns class of varargin
instead of input
the main issue here not performance, rather readability , having pretty code.
i suggest create separate function checks cell is, , call function in main function. way can check cell is, in single line. simple, fast, , easy read. since can save function , close script in editor, calling builtin one-liner. function can other input checks.
example function:
function idx = cell_index(c) idx = 0; if isempty(c) warning('no input given.') else ii = 1:numel(c) if(iscell(c{ii})) idx = ii; end end end if idx == 0 warning('the input contained no cells.') end end
now can following in main function:
function output = main_function(varargin) idx = cell_index(varargin) fprintf('the input number %d cell!\n', idx) % % or fprintf('the input number %d cell!\n, cell_index(varargin)) % rest of code
** loops versus other approaches:**
let's try out few functions:
appraoach 1: loop
this fastest one:
function s = testfunction1(varargin) ii = 1:numel(varargin) if(iscell(varargin{ii})) s = sprintf('the input %i cell!\n', ii); end end end
approach 2: cellfun
this slowest , hardest read (imo):
function s = testfunction2(varargin) if any(cellfun(@(x) iscell(x),varargin)) s = sprintf('the input %s cell\n', num2str(find(cellfun(@(x) iscell(x),varargin)))); end end
approach 3: cellfun
this easiest one, assuming don't want loops
function s = testfunction3(varargin) x = find(cellfun(@(x) iscell(x),varargin)); if ~isempty(x) s = sprintf('the input %i cell \n',x); end end
the following benchmarking performed using matlab r2014b, prior new jit engine!
f = @() testfunction1(b,c,d); g = @() testfunction2(b,c,d); h = @() testfunction3(b,c,d); timeit(f) ans = 5.1292e-05 timeit(g) ans = 2.0464e-04 timeit(h) ans = 9.7879e-05
summary:
if want use loop-free approach, suggest last approach (the second cellfun
version). performs 1 find
, 1 call cellfun
. it's therefore easier read, , it's faster.
Comments
Post a Comment