isempty: Not enough input arguments.

9 vues (au cours des 30 derniers jours)
Octavian
Octavian le 19 Mar 2020
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 commentaire
Adam Danz
Adam Danz le 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.

Connectez-vous pour commenter.

Réponse acceptée

Steven Lord
Steven Lord le 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.

Plus de réponses (2)

Fangjun Jiang
Fangjun Jiang le 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

Image Analyst
Image Analyst le 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.

Catégories

En savoir plus sur Structures dans Help Center et File Exchange

Tags

Produits

Community Treasure Hunt

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

Start Hunting!

Translated by