isempty: Not enough input arguments.
    10 views (last 30 days)
  
       Show older comments
    
Dear All, 
I have an empty structure x.y.z
isfield(x.y, 'z') is logical 1, but
isempty(x.y.z) gives me this error:
Error using isempty
Not enough input arguments.
How to check that z is empty? Thank you, 
OL
1 Comment
  Adam Danz
    
      
 on 19 Mar 2020
				You shouldn't get that error.
x.y.z = []; 
isfield(x.y,'z')    % = true
isempty(x.y.z)      % = true
Confirm that you're using Matlab's isempty function. 
which isempty -all
The output should include a list of built-in functions/methods. 
Accepted Answer
  Steven Lord
    
      
 on 19 Mar 2020
        The problem is not that the field z of x.y is empty. The problem is that the field y of x is. In the example below, due to the behavior of the struct constructor when one of the values of the fields is a cell array, x.y is a 0-by-0 struct array.
x.y = struct('z', {});
size(x.y) % [0 0]
When S is a struct array with a field T, S.T makes what's known as a comma-separated list with one element per element of S. Consider:
q.y = struct('z', 1);
{q.y.z} % {1}
w.y = struct('z', {2, 3:4});
{w.y.z} % {2, [3 4]}
As that documentation page states, when you create a comma-separated list you can pass it into a function as the input arguments, one input per element in the comma-separated list.
plus(w.y.z) % equivalent of plus(2, [3 4])
So when the struct from which you create the comma-separated list is empty, as it is if I were to create one from x.y, that's like calling the function with no inputs.
isempty(x.y.z) % equivalent of isempty()
isempty requires you to call it with an input.
Check that x.y has some data (is not empty, or better yet isscalar) before you start asking questions about its data.
0 Comments
More Answers (2)
  Fangjun Jiang
      
      
 on 19 Mar 2020
        Do you have an example data?
>> x.y.z=[]
x = 
  struct with fields:
    y: [1×1 struct]
>> isempty(x.y.z)
ans =
  logical
   1
0 Comments
  Image Analyst
      
      
 on 19 Mar 2020
        It should work.  See this:
% Assign x.y.z to some value.
x.y.z = 10
tf = isempty(x.y.z) % Shows false
% Now make field z empty.
x.y.z = []; % Null, empty
tf = isempty(x.y.z) % Shows true
% Remove the field z
x.y = rmfield(x.y, 'z')
tf = isempty(x.y.z) % Throws error
Attach your data if you still have trouble.
0 Comments
See Also
Categories
				Find more on Structures in Help Center and File Exchange
			
	Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!



