【问题标题】:matlab. vectorization within if/else if/else statementsMATLAB。 if/else if/else 语句中的向量化
【发布时间】:2013-09-11 12:53:09
【问题描述】:

我需要以下代码方面的帮助:

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 参数。请帮忙。谢谢。

【问题讨论】:

  • 一定要检查if声明:if ... elseif ... else ... endelseif之间没有空格)
  • 我改了,但没有解决问题
  • 请注意,如果最后两列彼此相等,您的输出也将为NaN。如果这是不可取的,请使用 &gt;= 而不是 &gt; 或为这种可能性添加另一个索引。

标签: matlab if-statement vectorization


【解决方案1】:

if x(:,3)&gt;x(:,4) 不起作用,if 期望 truefalse 不是向量。所以它只评估向量x(:,3)&gt;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)

【讨论】:

  • 猜猜这是对我想法的有力证实!
【解决方案2】:

使用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)));

【讨论】:

  • 感谢您的意见。我希望我能一起避免为我的所有项目编制索引:)
【解决方案3】:

你可以这样做:

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);

【讨论】:

    猜你喜欢
    • 2020-11-23
    • 2023-03-28
    • 2019-04-09
    • 1970-01-01
    • 2016-10-13
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    相关资源
    最近更新 更多