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

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