Trying to find all the average of negative numbers under certain conditions

27 visualizaciones (últimos 30 días)
Hi,
I'm trying to find the average of numbers less than 0 in one column that correspond with positive numbers in the rows of another column. I have the following code written. The avg for positives works, but the negatives return a positive number. There is obviously something going on. Could you please help? I attached the spreadsheet I used to this post.
clear all
xy= xlsread('xy_2.3.17.xlsx'); %Download spreadsheet to MATLAB
x = xlsread('xy_2.3.17.xlsx','A:A'); %Choose row
y = xlsread('xy_2.3.17.xlsx', 'B:B');%Choose row
rows = xy(:,2)>0; %Logical vector with the rows which satisfy all conditions.
if any(rows) % True if there is at least 1 row which meats the condition.
avgx= mean(x(rows)); %Avg. when x > 0
avgNeg = mean(y>0 & x<0); %Avg Negatives

Respuesta aceptada

per isakson
per isakson el 4 de Feb. de 2017
Editada: per isakson el 4 de Feb. de 2017
Replace
avgNeg = mean(y>0 & x<0); %Avg Negatives
by
avgNeg = mean( x(y>0 & x<0) ); %Avg Negatives
  2 comentarios
Alexandra Brian
Alexandra Brian el 4 de Feb. de 2017
Editada: Alexandra Brian el 4 de Feb. de 2017
Thanks per isakson! Would you mind explaining why the second code works over the first? I have an idea, but I would appreciate clarification.
per isakson
per isakson el 5 de Feb. de 2017
Editada: per isakson el 5 de Feb. de 2017
Background
This is "legal" with Matlab
>> 'a'+true+ones(true,true,'single')
ans =
99
>>
>> mean([true,true,false])
ans =
0.6667
With Matlab there is a tendency to save on keystrokes, write compact code and sacrifice on readability.
Intermediate Values says: "When calculating complex formulae, it is useful to break up the calculation into intermediate temporary variables."
Break up &nbsp mean( y>0 & x<0 )
is_y_gt_zero = y>0; % logical vector
is_x_lt_zero = x<0; % logical vector
is_avg_neg = is_y_gt_zero & is_x_lt_zero; % logical vector
num_avg_neg = double( is_avg_neg ); % double vector (type convertion)
avgNeg = mean( num_avg_neg ); % double scalar
Break up &nbsp mean( x( y>0 & x<0 ) )
is_y_gt_zero = y>0; % logical vector
is_x_lt_zero = x<0; % logical vector
is_avg_neg = is_y_gt_zero & is_x_lt_zero; % logical vector
num_avg_neg = x( is_avg_neg ); % double vector (logical indexing)
avgNeg = mean( num_avg_neg ); % double scalar
Execute these two and compare the values of the intermediate temporary variables.

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Data Type Conversion en Help Center y File Exchange.

Etiquetas

Aún no se han introducido etiquetas.

Community Treasure Hunt

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

Start Hunting!

Translated by