1

我习惯于使用 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 为空的元素。

4

1 回答 1

1

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

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

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

于 2013-04-03T16:03:54.263 回答