7

我需要以下代码的帮助:

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

这是一个示例数据:

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

我不确定如何使代码工作。它只接受第一个参数并忽略 else if 和 else 参数。请帮忙。谢谢你。

4

3 回答 3

8

if x(:,3)>x(:,4)并没有真正起作用,if需要truefalse不需要向量。所以它只评估向量的第一个元素,x(:,3)>x(:,4)这就是为什么它似乎忽略了你的elseif.

因此,您必须要么使用循环,要么更好地使用这样的逻辑索引:

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)
于 2013-09-11T13:04:34.157 回答
5

用于sign避免针对不同条件进行索引。

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

或者以更短且可读性更低的形式:

B=diff(x,1,2);
output = B(:,1) .* (sign(B(:,3))+0./sign(B(:,3)));
于 2013-09-11T13:32:15.553 回答
2

您可以这样做:

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);
于 2013-09-11T13:05:54.187 回答