Как я могу отобразить и получить доступ к содержимому массива структуры в MATLAB? - PullRequest
3 голосов
/ 19 мая 2011

Во-первых, у меня есть пользователь, который вводит свои собственные текстовые файлы, состоящие из состояний, столиц и групп населения, и я помещаю все эти значения в массив структуры, используя следующий код:

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);

Мой первый вопрос: возможно ли отобразить все значения в структуре?Отображение массива структуры просто дает мне это:

50x1 struct array with fields:

    State
    Capital
    Population

И мой второй вопрос: могу ли я получить доступ к информации в этой структуре, пытаясь найти, например, только 'California'?

1 Ответ

7 голосов
/ 19 мая 2011

Как вы уже обнаружили, отображение структурных массивов по умолчанию в MATLAB не говорит вам ничего, кроме размеров массива и имен полей. Если вы хотите увидеть содержимое, вам придется создать форматированный вывод самостоятельно. Один из способов сделать это - использовать STRUCT2CELL для сбора содержимого структуры в массиве ячеек, а затем использовать FPRINTF для отображения содержимого ячейки в определенном формате. Вот пример:

>> 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

Что касается вашего второго вопроса, вы можете собрать записи из полей 'State' в массиве ячеек, сравнить их с данным именем с STRCMP , чтобы получить логический индекс , затем получите соответствующий элемент массива структуры:

>> 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

Примечание:

Как вы упомянули в комментарии, каждая запись 'Population' в вашем массиве структуры в конечном итоге будет содержать весь вектор данных о населении 50 на 1. Это, вероятно, связано с тем, что file{3} в вашем примере кода содержит vector , тогда как file{1} и file{2} содержат массивы ячеек . Чтобы правильно распределить содержимое вектора в file{3} по элементам структурного массива, необходимо разбить вектор на части и поместить каждое значение в отдельную ячейку массива ячеек, используя перед этим NUM2CELL передавая его STRUCT . Определение Population как это должно решить проблему:

Population = num2cell(file{3});
...