matlab. vectorization within if/else if/else state

2020-04-05 04:28发布

I need some help with the following code:

if x(:,3)>x(:,4)
output=[x(:,1)-x(:,2)];
elseif x(:,3)<x(:,4)
output=[x(:,2)-x(:,1)];
else
output=NaN
end

Here is a sample data:

matrix x              output
10   5   1   2        -5
10   5   2   1         5     
NaN  1   1   3         NaN

I'm not sure how to make the code work. It just takes the first argument and ignores the else if and else arguments. Please help. Thank you.

3条回答
贼婆χ
2楼-- · 2020-04-05 05:09

Using sign to avoid indexing for different conditions.

B=diff(x,1,2);
B(B(:,3)==0,3) = NaN;
output = B(:,1) .* sign(B(:,3));

Or in a shorter and less readable form:

B=diff(x,1,2);
output = B(:,1) .* (sign(B(:,3))+0./sign(B(:,3)));
查看更多
该账号已被封号
3楼-- · 2020-04-05 05:16

if x(:,3)>x(:,4) doesn't really work, if expects either true or false not a vector. So it only evaluates the first element of the vector x(:,3)>x(:,4) which is why it appears to ignore your elseif.

So you must either use a loop or even better you can use logical indexing like this:

x= [10   5   1   2        
10   5   2   1        
NaN  1   1   3]

output = NaN(size(x,1),1)
I = x(:,3)>x(:,4);
output(I) = x(I,1)-x(I,2);
I = x(:,3)<x(:,4);
output(I) = x(I,2)-x(I,1)
查看更多
可以哭但决不认输i
4楼-- · 2020-04-05 05:21

Here is how you can do it:

output = NaN(size(x,1),1);

idx1 = x(:,3)>x(:,4);
idx2 = x(:,3)<x(:,4);

output(idx1) = x(idx1,1)-x(idx1,2);
output(idx2) = x(idx2,2)-x(idx2,1);
查看更多
登录 后发表回答