2017-09-21 4 views
0

je voudrais calculer le revenu total dans un magasin toutes les 30 minutes,valeurs Extrait de lignes satisfaisant un critère donné

J'ai un ensemble de données comme:

hour minute price 

0  1  12,5 
0  1  10 
0  2  15 
0  3  15 

J'ai essayé de mettre en œuvre le montant total comme ceci:

[rows,cols,vals] = find(0 < data(:,2) & data(:,2) < 31); 

mais je ne peux pas obtenir ce que je voulais.

Répondre

0

Vous devez utiliser l'indexation logique pour obtenir les prix dans une fourchette de 30 minutes:

data(0 < data(:,2) & data(:,2) < 31, 3) 

Pourquoi trouver ne fait pas ce que vous attendez?

find travaux sur le résultat de l'expression suivante 0 < data(:,2) & data(:,2) < 31, à savoir [1 1 1 1].' Il ne sait rien au sujet de la matrice d'origine data. Par conséquent, les deuxième et troisième arguments sont inutiles dans ce cas. Ils seraient utiles pour obtenir le nonzero elements in a matrix.

En tant que (moins efficace) alternative à l'indexation logique, vous pouvez obtenir le même résultat comme suit:

data(find(0 < data(:,2) & data(:,2) < 31), 3) 

Sélection d'une heure spécifique

À l'heure actuelle, vous sélectionnez les prix des la première moitié de chaque heure. Pour sélectionner par exemple les prix midi 00-00h30, vous pouvez utiliser les éléments suivants:

data(data(:,1) == 0 && 0 < data(:,2) & data(:,2) < 31, 3) 
+0

merci pour la réponse rapide mais je ne marche pas car il retourne valeurs à la 2ème heure, 3ème, 4ème heure ... ainsi de suite. Je voudrais ajouter des valeurs entre 00:00 - 00:30, 00: 30-1: 00, 1:00 - 1:30 .... –

+0

Bien sûr, vous devez ajouter une condition supplémentaire sur la première colonne. – m7913d

0

J'ai trouvé la solution

data(:,2) =((data(:,2) ./ 30) + 1); 
data(:,2)= floor(data(:,2)); 
changes = find(diff(data(:,2)))+1; 

for i=1:1:(length(changes) -1) 
A(i)=sum(data(changes(i):changes(i+1),3)) 
end