How can I display and access structure array contents in MATLAB?

28,644

As you've already discovered, the default display of structure arrays in MATLAB doesn't tell you much, just the array dimensions and field names. If you want to see the contents, you'll have to create formatted output yourself. One way you can do this is to use STRUCT2CELL to collect the structure contents in a cell array, then use FPRINTF to display the cell contents in a particular format. Here's an example:

>> regions = struct('State',{'New York'; 'Ohio'; 'North Carolina'},...
                    'Capital',{'Albany'; 'Columbus'; 'Raleigh'},...
                    'Population',{97856; 787033; 403892});  %# Sample structure
>> cellData = struct2cell(regions);         %# A 3-by-3 cell array
>> fprintf('%15s (%s): %d\n',cellData{:});  %# Print the data
       New York (Albany): 97856
           Ohio (Columbus): 787033
 North Carolina (Raleigh): 403892

With regard to your second question, you can collect the entries from the 'State' fields in a cell array, compare them to a given name with STRCMP to get a logical index, then get the corresponding structure array element:

>> stateNames = {regions.State};            %# A 1-by-3 cell array of names
>> stateIndex = strcmp(stateNames,'Ohio');  %# Find the index for `Ohio`
>> stateData = regions(stateIndex)          %# Get the array element for `Ohio`

stateData = 

         State: 'Ohio'
       Capital: 'Columbus'
    Population: 787033

NOTE:

As you mention in a comment, each 'Population' entry in your structure array ends up containing the entire 50-by-1 vector of population data. This is likely due to the fact that file{3} in your sample code contains a vector, while file{1} and file{2} contain cell arrays. In order to properly distribute the contents of the vector in file{3} across the elements of the structure array, you need to break the vector up and place each value in a separate cell of a cell array using NUM2CELL before passing it to STRUCT. Defining Population like this should solve the problem:

Population = num2cell(file{3});
Share:
28,644
Nick
Author by

Nick

Updated on March 30, 2020

Comments

  • Nick
    Nick about 4 years

    Firstly, I have the user input their own text files consisting of states, capitals, and populations and I put all of these values into a structure array using the following code:

    clear
    clc
    %Part A
    textfile=input('What is the name of your text file?\n','s');
    fid=fopen(textfile);
    file=textscan(fid,'%s %s %f','delimiter',',');
    State=file{1}
    Capital=file{2}
    Population=file{3}
    regions=struct('State',State,...
        'Capital',Capital,...
        'Population',Population)
    fclose(fid);
    

    My first question: is it possible to display all of the values in the structure? Displaying the structure array just gives me this:

    50x1 struct array with fields:
    
        State
        Capital
        Population
    

    And my second question: is it possible for me to access information in this structure by trying to find, for example, 'California' only?

  • Nick
    Nick almost 13 years
    for the first part in displaying the structure, i keep on getting the error "Function is not defined for 'cell' inputs." The first thing that comes to my mind when that happens, is that im not labeling %s and %d correctly in the fprintf command
  • Nick
    Nick almost 13 years
    i think i might have found the problem, but i can figure out how to fix it, when i type in regions.Population to see how the answer comes out, it gives me a 50x1 array consisting of all the populations for each state...so the cell array is displaying for example 'Massachusetts' 'Boston' [50x1 int32]
  • Nick
    Nick almost 13 years
    i think i might have found the problem, but i can figure out how to fix it, when i type in regions.Population to see how the answer comes out, it gives me a 50x1 array consisting of all the populations for each state...so the cell array is displaying for example 'Massachusetts' 'Boston' [50x1 int32]
  • gnovice
    gnovice almost 13 years
    @Nick: I updated my answer to address the likely source of your error.