【发布时间】:2016-08-28 09:28:47
【问题描述】:
我是 Matlab 的新手。我采用了复杂的if-statement 条件的工作代码,需要重写它。此代码应准备一些初始数据来解决优化任务。这个if-statement 条件看起来像:
x=[784.8 959.2 468 572 279 341 139.5 170.5 76.5 93.5 45 55];
a=nchoosek(x,6); % all possible combinations from 6 elements of x
n=length(a);
q=[];
for i=1:n
if( ((a(i,1)==x(1)) & (a(i,2)==x(2))) |
((a(i,1)==x(3)) & (a(i,2)==x(4))) |
((a(i,1)==x(5)) & (a(i,2)==x(6))) |
((a(i,1)==x(7)) & (a(i,2)==x(8))) |
((a(i,2)==x(3)) & (a(i,3)==x(4))) |
((a(i,2)==x(5)) & (a(i,3)==x(6))) |
((a(i,2)==x(7)) & (a(i,3)==x(8))) |
((a(i,3)==x(3)) & (a(i,4)==x(4))) |
((a(i,3)==x(5)) & (a(i,4)==x(6))) |
((a(i,3)==x(7)) & (a(i,4)==x(8))) |
((a(i,3)==x(9)) & (a(i,4)==x(10)))|
((a(i,4)==x(5)) & (a(i,5)==x(6))) |
((a(i,4)==x(7)) & (a(i,5)==x(8))) |
((a(i,4)==x(9)) & (a(i,5)==x(10)))|
((a(i,5)==x(5)) & (a(i,6)==x(6))) |
((a(i,5)==x(7)) & (a(i,6)==x(8))) |
((a(i,5)==x(9)) & (a(i,6)==x(10)) |
((a(i,5)==x(11)) & (a(i,6)==x(12)))))
q(i,:)=a(i,:);
end;
end;
q;
R1=a-q;
R1(~any(R1,2),:) = [];
R1(:, ~any(R1)) = [];
问题:谁能给出一个想法如何重写if-statement以提高代码的可读性?
【问题讨论】:
-
除了你之外的任何人都几乎不可能简化这种情况;所有这些组件背后没有任何意义。然而,一个建议是:使用逻辑而不是位操作,因为前者会短路(可能),而后者不会。
-
另请注意,您的最后一行是一个 OR 案例,而前几行每行包含 2 个案例。这远非简单的条件分割(我会每行使用一个顶级 OR),甚至可能是您这边的错误。
-
最后一点:如果您将一个数组的排列与另一个数组进行比较,为什么不生成索引而不是值本身,在这种情况下,您可以测试整数的相等性(而不是谁知道什么? )?
-
@AndrasDeak,感谢您的评论,尤其是最后一点,我不考虑世代指数。
标签: matlab if-statement combinations