Matlab - Как я могу преобразовать набор массивов ячеек в массив, который позволяет индексировать? - PullRequest
0 голосов
/ 07 ноября 2019

Я борюсь с этой проблемой в течение дня и не могу найти решение где-либо в Интернете. У меня есть четыре массива ячеек с данными по каждой стране, в которых я выполняю операции, чтобы найти ряд стран, которые я хочу проанализировать. Я сохранил эти страны в массиве ячеек 27x1 с нечисловыми атрибутами, выходные данные которого выглядят следующим образом:

'Belgium'
'Bulgaria'
'Croatia'
'Cyprus'
'Czechia'
'Denmark'
'Estonia'

Это пример строк, которые я хочу вычесть из других массивов ячеек с данными по каждой стране. Проблема заключается в том, что массивы ячеек не позволяют индексировать, что означает, что я не могу использовать их для вычитания данных из других массивов ячеек. Итак, что я хочу получить в качестве выходных данных, так это массив, который позволяет индексировать, чтобы я мог использовать этот массив для вычитания информации о других массивах ячеек.

Что я пробовал:

  • Я попытался str2double для создания строк, которые позволяют индексирование. Это привело к значениям NaN, которые не позволяли выполнять какие-либо операции.
  • Я пробовал cell2mat, который выдал ошибку: Размеры конкатенируемых массивов не согласованы.
  • Я пытался создать таблицу из ячейкимассивы, но я вставляю все данные в него из разных массивов ячеек, потому что я вычитаю их

Я новичок здесь, поэтому я не знаю, как я могу добавить свой файл .m и массивы ячеек. Поэтому я добавляю часть своего кода здесь:

[~,ia,ib] = intersect(pop(:,1),gdp(:,1));
Com_popgdp = [pop(ia,1:2),gdp(ib,2)];

[~,ia,ib] = intersect(fp(:,1),lr(:,1));
Com_fplr = [fp(ia,1:2),lr(ib,2)];

[~,ia,ib] = intersect(Com_popgdp(:,1),Com_fplr(:,1));
Com_all = [Com_popgdp(ia,1:2),Com_fplr(ib,2)]; 

Com_all = Com_all(:,1);

%Com_all is the resulting cell array with all countries that I want to
%analyse resulting from the intersections of cell arrays. For the analysis, 
%I must extract the Com_all rows from
%pop/gdp/fp/lr. However, this is not possible with cell arrays. How can I
%access and extract the rows from pop/gdp/fp/lr for my analysis?

Может ли кто-нибудь помочь мне найти способ, которым я могу использовать массивы ячеек выбора в качестве индексации для вычитания данных из других массивов ячеек? Какой метод подойдет?

Ответы [ 2 ]

1 голос
/ 07 ноября 2019

Существует более простое решение, чем я изначально думал.

Во-первых, измените наши массивы ячеек на таблицы

gdp = cell2table(gdp,'VariableNames',{'country','gdp'})

Или вы можете прочитать их непосредственно как таблицы (https://www.mathworks.com/help/matlab/ref/readtable.html).

Пока все таблицы имеют одинаковое имя для столбца с названием страны, вы можете использовать innerjoin для пересечения таблиц по стране.

Вот пример, который я запускаю, чтобы проверить это:

gdp = {'Belgium',1;'Bulgaria',2;'Croatia',3};
pop = {'Croatia',30; 'Cyprus', 40; 'Czechia', 50};
gdp = cell2table(gdp,'VariableNames',{'country','gdp'})
gdp =

  3×2 table

     country      gdp
    __________    ___

    'Belgium'      1 
    'Bulgaria'     2 
    'Croatia'      3 

popTable = cell2table(pop,'VariableNames',{'country','pop'})
pop =

  3×2 table

     country     pop
    _________    ___

    'Croatia'    30 
    'Cyprus'     40 
    'Czechia'    50

innerjoin(gdpTable,popTable)
1×3 table

     country     gdp    pop
    _________    ___    ___

    'Croatia'     3     30 
0 голосов
/ 08 ноября 2019

Мне кажется, что вы сначала хотите вычислить пересечение всех списков названий стран, а затем соответствующим образом проиндексировать массивы ячеек. intersect находит пересечение двух списков, вы можете вызвать его несколько раз подряд, чтобы пересечь несколько списков. И ismember определяет, какая из выбранных стран присутствует. Например:

A1 = {
'Bulgaria',2
'Croatia',3
'Cyprus',4
'Czechia',5
'Denmark',6
'Estonia',7
};

A2 = {
'Belgium',11
'Bulgaria',12
'Croatia',13
'Cyprus',14
'Denmark',16
'Estonia',17
};

A3 = {
'Belgium',21
'Croatia',23
'Cyprus',24
'Czechia',25
'Denmark',26
'Estonia',27
};

[countries] = intersect(A1(:,1),A2(:,1));
[countries] = intersect(countries,A3(:,1));
i1 = ismember(A1(:,1),countries); A1 = A1(i1,:);
i2 = ismember(A2(:,1),countries); A2 = A2(i2,:);
i3 = ismember(A3(:,1),countries); A3 = A3(i3,:);
A = [A1,A2(:,2),A3(:,2)];

Приведенный выше код предполагает, что все три массива входных ячеек имеют страны в одинаковом порядке. Если это не так, отсортируйте массивы, используя sort, прежде чем сопоставлять их со списком выбранных стран:

i1 = ismember(sort(A1(:,1)),countries);
...