操作后访问数组元素

时间:2013-04-03 15:15:49

标签: arrays matlab numpy

我习惯使用Python的数组,我可以在计算后直接访问数组元素,而不将结果定义为单独的数组。 (我知道这是100%混乱,这是一个例子:) 我能做到:

>>> x = np.array([1,2,3], dtype=np.double)
>>> y = np.array([4,0,6], dtype=np.double)
>>> x/y
array([ 0.25,  inf,  0.5 ])
>>> (x/y)[np.isfinite(x/y)]
array([ 0.25, 0.5 ])

我知道它不像定义一个新变量那么清晰(比如说z = x/y),但是当我创建lambda函数时它很有用。

我想在Matlab中做同样的事情,在匿名函数(@函数)中使用,但我找不到办法。等效的(x./y)(isfinite(x./y))显然不起作用,但有另一种方法从数组中获取元素吗?我不想使用x(isfinite(x))./y(isfinite(y)),因为它不会捕获y为null的元素。

1 个答案:

答案 0 :(得分:1)

正如yuk已在评论中指出,subsref是解决实际问题的方法。这解决了这个问题,但使用的实现通常很难编写,读取和修改。

您实际可能想要做的是使用quickie帮助函数。下面是演示所有这些方法的示例代码。

%Setup
x = [1 2 3];
y = [4 0 6];

%Raw computation
x./y

%Temporary variable filtering
temp = x./y;
example1 = temp(isfinite(temp))

%Filtering using subsref call, using "struct" to construct the needed
%referencing operation.  This is equivalent to  
%    "(x./y)(isfinite(x./y)", 
%if that were legal
example2 = subsref(x./y, ...
    struct('type','()','subs',{{isfinite(x./y)}})    )

%More readable implementation, using a quickie helper
keepFinite = @(x) x(isfinite(x));
example3 = keepFinite(x./y)

使用上面的示例,keepFinite函数可用于进一步构造lambda函数。例如:fn = @(x,y)someotherOperation(keepFinite(x./y));