Check if Matlab struct, dynamic Field Value is empty - matlab

I have a struct x, with dynamic Fields, respectively dynamic Field names. But basically, only the first Field is relevant for me.
So I want to check if the Value of the first Field is empty, speak a 1x1cell or a 0x1cell..
or
I'm experimenting e.g. with:
isempty(fieldnames(x))
isempty(x(1))
if isempty(x(1))
msgbox('empty')
else
msgbox('result')
end
but got to no solution. Does anybody have a clue?
Speak, check if the Value of the first Field of the struct is empty or not..

If only the first field is relevant to you, then you can proceed as follows :
Get the fieldnames list of your struct
names=fieldnames(x);
Get the size of the first field
SizeOfFirstField=size(x.(names{1}));
Then you can just check if the first value in SizeOfFirstField is 0 or 1 in your if condition :
if SizeOfFirstField(1)==0
msgbox('empty')
else
msgbox('result')
end

Maybe you can also try this shorter form:
isempty(fieldnames(x))
where x is your struct variable.

Related

How to find unique values in a field of a nested struct

I have a nested struct user.data and I want to find the unique values of the field touristicRoute (user.data.touristicRoute)
I have tried this code:
for m=1:size(Cluster_USERS,1)
for i=1:size(userTouristicTraj(m).touristicData,2)
if (user(m).data(i).touristicRoute~=0)
uniqueValues=unique(user(m).data(i).touristicRoute)
end
end
end
but it doesn't give me the right value, can you help me?
The unique value of a single struct is that value itself. If you want to see the unique values of all structs, then you need to extract them first.
for m=1:size(Cluster_USERS,1)
for i=1:size(userTouristicTraj(m).touristicData,2)
if (user(m).data(i).touristicRoute~=0)
for jj=size(user(m).data(i).touristicRoute,1)
values=unique([(user(m).data(i).touristicRoute{jj}).' values]);
end
end
end
end

How to set a name for the cell

I have a cell array. when I want create a cell array that its name is : '0691008752' in this case an error :"Invalid field name"
cellUsers.('0691008752') = ....
I know the reason for this error is that a number is called. But I do not know how I can set this name for the cell.
I agree with the comments above, prepending the field with a letter is the best solution for this problem..
One way to make this consistent is to use:
fname = matlab.lang.makeValidName('0691008752')
Its not widely known but you can have fields which begin with number - its bad practice and will almost certainly leads to bugs....
So how to do it, 1st you need to use mex, if you see the mathworks mex example and modify the appropriate line:
memcpy(fieldnames[0],"Doublestuff",sizeof("Doublestuff"));
to:
memcpy(fieldnames[0],"01234",sizeof("01234"));
After compiling and running you get:
Note: You can only access it through dynamic fields names. To update the field you must use mex.

Matlab bad cell reference operation when if statement

I have a <850x1> cell called x. Each of the individual structures has a 'Tag' name and 'Data' cell with <7168x1 double> data values.
(i.e.
x{1,1}.Tag = 'Channel1', x{1,1}.Data= <7168x1 double>)
So, I want to go through the x cell, identify the structures with 'Channel1' Tag names and pull out that structure's data. Then, combine the data into a cell called Ch1. Here is my approach so far:
n=1:850
if x{n,1}.Tag == 'Channel1'
Ch1{:,n} = x{n,1}.Data;
end
However, this gives an error: Bad cell reference operation.
Any ideas what may be going wrong?
There are 2 issues here. First, your if statement will compare each entry in the string x{n,1}.Tag to each entry in the string 'Channel1'. If the dimensions are not the same, you will get an error. To fix this, you could use the string compare function, strcmp. The other issue is that you are assigning n to all values between 1 and 850 at once. This is the issue that is producing the actual error you are seeing. Instead, you want to step through each of these values one at a time with a for loop. I would suggest trying the following code:
for n=1:850
if strcmp(x{n,1}.Tag, 'Channel1')
Ch1{:,n} = x{n,1}.Data;
end
end

JQuery Wildcard for using atttributes in selectors

I've research this topic extensibly and I'm asking as a last resort before assuming that there is no wildcard for what I want to do.
I need to pull up all the text input elements from the document and add it to an array. However, I only want to add the input elements that have an id.
I know you can use the \S* wildcard when using an id selector such as $(#\S*), however I can't use this because I need to filter the results by text type only as well, so I searching by attribute.
I currently have this:
values_inputs = $("input[type='text'][id^='a']");
This works how I want it to but it brings back only the text input elements that start with an 'a'. I want to get all the text input elements with an 'id' of anything.
I can't use:
values_inputs = $("input[type='text'][id^='']"); //or
values_inputs = $("input[type='text'][id^='*']"); //or
values_inputs = $("input[type='text'][id^='\\S*']"); //or
values_inputs = $("input[type='text'][id^=\\S*]");
//I either get no values returned or a syntax error for these
I guess I'm just looking for the equivalent of * in SQL for JQuery attribute selectors.
Is there no such thing, or am I just approaching this problem the wrong way?
Actually, it's quite simple:
var values_inputs = $("input[type=text][id]");
Your logic is a bit ambiguous. I believe you don't want elements with any id, but rather elements where id does not equal an empty string. Use this.
values_inputs = $("input[type='text']")
.filter(function() {
return this.id != '';
});
Try changing your selector to:
$("input[type='text'][id]")
I figured out another way to use wild cards very simply. This helped me a lot so I thought I'd share it.
You can use attribute wildcards in the selectors in the following way to emulate the use of '*'. Let's say you have dynamically generated form in which elements are created with the same naming convention except for dynamically changing digits representing the index:
id='part_x_name' //where x represents a digit
If you want to retrieve only the text input ones that have certain parts of the id name and element type you can do the following:
var inputs = $("input[type='text'][id^='part_'][id$='_name']");
and voila, it will retrieve all the text input elements that have "part_" in the beginning of the id string and "_name" at the end of the string. If you have something like
id='part_x_name_y' // again x and y representing digits
you could do:
var inputs = $("input[type='text'][id^='part_'][id*='_name_']"); //the *= operator means that it will retrieve this part of the string from anywhere where it appears in the string.
Depending on what the names of other id's are it may start to get a little trickier if other element id's have similar naming conventions in your document. You may have to get a little more creative in specifying your wildcards. In most common cases this will be enough to get what you need.

How to get the last field of a struct in MATLAB?

Take an example,
a = struct('in',1,'out',2)
b = struct('temperature',6,'light',5,'output',2)
How do I get the last field and value that I input?
To get the last field of a,
z = a.out
To get the last field of b,
x = b.output
Or if you don't know what the field names are you can find them in the following way:
names = fieldnames(a)
I hope that helps.
The documentation for a struct says:
The most common way to access the data
in a structure is by specifying the
name of the field that you want to
reference.
In contrast to an array, where elements are accessed by index -> position, a struct field is accessed by the fieldname -> name.
See How do I access MATLAB structure fields within a loop? on how to iterate over all all fields of a struct.