How to calculate the number from a database

1 visualización (últimos 30 días)
Kaijia Chen
Kaijia Chen el 30 de Nov. de 2021
Comentada: Akira Agata el 8 de Dic. de 2021
I have a struct which records 10 TV, in each struct the film's countries are provided.
There're 3 different countries(US, CN, CA) in the struct. I need to determine the total amount of TV shot by each countries.
I tried to use this function, but it only works for a single country, when the I add more than one country, the total number is inaccurate.
function [countries, count] = movies_countries(films)
count = ['US';'CA';'CN'];
US = [];CA = [];CN = [];
countries = [];
for ii = 1:length(TV)
if ~isempty(strfind(upper(TV(ii).country),'US'))
US(end+1) = ii;
A1 = size(US);
B1 = A1(1,2);
if ~isempty(strfind(upper(TV(ii).country),'CA'))
CA(end+1) = ii;
A2 = size(CA);
B2 = A2(1,2);
if ~isempty(strfind(upper(films(ii).country),'CN'))
FR(end+1) = ii;
A3 = size(CN);
B3 = A3(1,2);
countries = [B1 B2 B3]
end
end
end
This is the database:
TV(1).country = 'US';
TV(2).country = 'US';
TV(3).country = 'CN';
TV(4).country = 'CN';
TV(5).country = 'CA';
TV(6).country = 'US';
TV(7).country = 'CN';
TV(8).country = 'CN';
TV(9).country = 'US';
TV(10).country = 'US'
The final output should looks like:
countries = 'US'; 'CN';'CA'
count = 5 4 1
  5 comentarios
Kaijia Chen
Kaijia Chen el 30 de Nov. de 2021
Sure!
This is the expected output
>>[countries count] = movies_by_countries(films)
countries =
3×2 char array
'US'
'CN'
'CA'
count =
5 4 1
Kaijia Chen
Kaijia Chen el 30 de Nov. de 2021
And the TV is just a 1×10 struct array.

Iniciar sesión para comentar.

Respuesta aceptada

Akira Agata
Akira Agata el 30 de Nov. de 2021
How about the following?
List = arrayfun(@(x) x.country, TV,...
'UniformOutput', false);
[Group, Country] = findgroups(List');
Count = accumarray(Group,1);
>> Country
Country =
3×1 cell array
{'CA'}
{'CN'}
{'US'}
>> Count
Count =
1
4
5
  3 comentarios
Kaijia Chen
Kaijia Chen el 30 de Nov. de 2021
Hi, what if there exists a film produces more than one country.
For example if
So your equation produces
But I don't want {'US' 'CN'}, I want three catagory {'CA'} {'CN'} {'US'}
Akira Agata
Akira Agata el 8 de Dic. de 2021
I believe the following will work for such case:
List = arrayfun(@(x) x.country, TV,...
'UniformOutput', false);
List2 = cellfun(@(x) split(x,'''')', List,...
'UniformOutput', false);
List2 = [List2{:}];
[Group, Country] = findgroups(List2');
Count = accumarray(Group,1);

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Interactive Model Editing en Help Center y File Exchange.

Community Treasure Hunt

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

Start Hunting!

Translated by