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

13 次查看(过去 30 天)
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

采纳的回答

per isakson
per isakson 2017-2-4
编辑:per isakson 2017-2-4
Replace
avgNeg = mean(y>0 & x<0); %Avg Negatives
by
avgNeg = mean( x(y>0 & x<0) ); %Avg Negatives
  2 个评论
Alexandra Brian
Alexandra Brian 2017-2-4
编辑:Alexandra Brian 2017-2-4
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 2017-2-5
编辑:per isakson 2017-2-5
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.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Logical 的更多信息

标签

尚未输入任何标签。

Community Treasure Hunt

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

Start Hunting!

Translated by