我需要以下代码的帮助:
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参数。请帮忙。谢谢。
答案 0 :(得分:8)
if x(:,3)>x(:,4)
无效,if
要求true
或false
不是向量。所以它只评估向量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)
答案 1 :(得分: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)));
答案 2 :(得分: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);