我习惯使用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的元素。
答案 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));
。