2017-08-05 69 views
0

MATLAB中是否有一个特殊索引,在使用时不会导致正在执行的操作?没有执行任务的MATLAB索引

换句话说,我可以用更聪明的东西替代if子句来缩短以下代码吗?我的目标是对给定索引执行一些操作,以防它们“明智”,并且在特定索引(如-1,但可能有其他更好的选择)的情况下不做任何事情。

x = magic(3); 
r = [ 1, 3 ]; % Do nothing: -1 
if ~isequal(r, -1) 
    x(r, :) = 0; 
end 
+1

你想检查是否'R(I)〜= -1'?因为现在你只需检查'r'不是标量'-1'。无论如何,你是否尝试过:'x(r(r> 0&fix(r)== r),:) = 0;'? – EBH

+0

@EBH'-1'只是一个例子,我想也许你可以使用'NaN','inf'或'〜',但所有这些都不起作用,我应该更清楚。在任何情况下,我的理想解决方案都是使用一个空数组,'r = [];',这对我来说太明显了,一开始就看不到。不过谢谢你的灵感! – Discbrake

回答

1

如果r的唯一选项是索引向量或表示“无索引”的标量,则empty array是最好的解决方案。

然而,如果r始终是一个阵列(即使在尺寸1),并且你只是想跳过“非索引”在其内的值,可以键入:

x(r(r>0 & fix(r)==r),:) 

第一部分r>0只从r获得正值。第二部分fix(r)==r仅取自r的整数值。因此,您将得到r的一个子集,仅可使用索引r(r>0 & fix(r)==r)的值作为x的行索引。

下面是一个例子:

r = [5 -1 0 0.3 nan 65 pi]; 

>> r(r>0 & fix(r)==r) 
ans = 
    5 65 
1

是的,你可以做

x(r(r~=-1),:) = 0 
1

commentanswer启发,简单地用一个空数组作为一种特殊的指数,表明操作不应该执行:

x = magic(3); 
r = []; % [] % 1 % [ 1, 3 ] 
x(r, :) = 0 
+0

所以你想要的是,如果'r'(作为一个整体)是非法索引,Matlab不会抛出错误?如果'r = [5 -1 2 0.3 0.3]'会怎么样? – EBH

+0

@EBH不,不应执行操作,如果整个“r”是某个特殊实体,例如在这种情况下是一个空数组。否则,r保证只包含有效的索引。 – Discbrake