MATLAB Answers

1

How to check whether a structure exists?

Asked by Ben Wang on 7 May 2011
Latest activity Commented on by Walter Roberson
on 17 Oct 2017
Dear all:
I have a simple question and I can't find an answer on the web...
I have a function that takes arguments in. One argument is a structure array, and inside the function I want to test whether this argument is specified and feed into the function.
I tried isexist(), but this is not for a structure. isstruct() can test whether it is a structure, but the name must exist first. isfield() can check if a structural field exist, but not the structure itself.
So my question is, how to test whether a structure exist?
Any help is appreciated.
Cheers
Ben

  0 Comments

Sign in to comment.

Tags

4 Answers

Answer by Walter Roberson
on 7 May 2011
 Accepted Answer

exist('structurename','var')
[EDITED, Jan Simon 25-Feb-2012 22:00 UTC]: exists -> exist

  6 Comments

If you want to also check whether specific fields exist go to this file on the File-Exchange: https://au.mathworks.com/matlabcentral/fileexchange/28142-recursively-check-fields-of-a-structure-exist
This does not work for me:
exist(nonExistantFileStruct, 'var')
??? Undefined function or method 'exist' for input arguments of type 'struct'.
Pass in the name of the structure, not the structure itself.

Sign in to comment.


Answer by Loginatorist on 7 May 2011

I am not entirely sure what you want to do, but here is an example input parsing... You don't have to make your function error as I do, but the checks are there.
function [] = takestwoargs(A,B)
% Takes two arguments, the first is a structure, the second
% is a double. Both are required.
if nargin~=2
error('Two input arguments required.')
elseif ~isstruct(A)
error('The first input must be a structure.')
elseif ~isa(B,'double')
error('The second argument must be a double.')
end
%
%
%
%
EDIT In response to your comment below. To make defaults, you could do something like this:
function [] = takestwoargs(A,B)
% Takes two arguments, the first is a structure, the second
% is a double. Both are required.
N = nargin; % Check how many inputs were passed.
if N==0
A = struct('string','hello','yes','lengths',4);
B = 5;% Defaults.
elseif N==1
B = 5;% Default.
else
% Or make defaults and issue a warning that
% argumenst beyond the second are ignored....
error('Two many input arguments.')
end
if ~isstruct(A)
% Or make a default and issue a warning...
error('The first input must be a structure')
elseif ~isa(B,'double')
% Same as above...
error('The second argument must be a double')
end

  2 Comments

Hi Matt:
Thanks for helping out here. The function looks something like the following:
function [] = likelihood(A,B)
and B is a structure.
I guess I could use
if nargin~=2
error('Two input arguments required.')
to test whether B exists, but I don't want to put a restriction since if it is not parse to the function, I could use a default value specified inside the function.
Sorry I didn't make myself clear before. Is there a function I can test B exists in the workspace?
Cheers
Ben

Sign in to comment.


Answer by Jason Garcia on 25 Feb 2012

Or alternatively, you could try:
x =
x: 1
y: 2
z: 3
>> any(strcmp(fieldnames(x),'d'))
ans =
0
>> any(strcmp(fieldnames(x),'y'))
ans =
1

  2 Comments

More efficient: isfield(x, 'y')

Sign in to comment.


Answer by Céldor
on 31 Mar 2012

This thread is old but if someone still needs an answer then
exist('var_name') works and returns 0 if a structure does not exist in memory
Regards

  2 Comments

This is no sufficient solution in opposite to the advice Walter gave 329 days ago: "exist('var_name')" replies a non-zero if there is a corresponding .m, .p, .mex file or folder in the path, or if there is a Java class with this name. Because all these chances are checked, "exist()" is slow when used without 2nd argument. See "help exist".
But it can return non-zero if there happens to be something else by the same name, such as a function or directory. It is better to use the optional second argument to be specific that you are inquiring about a variable.

Sign in to comment.