在MATLAB中检索spfun,cellfun,arrayfun等中的元素索引

Ame*_*ina 13 matlab

有什么办法来检索索引上通过调用的函数的元素cellfun,arrayfunspfun行为?(即检索函数范围内元素的索引).

为简单起见,想象一下我有以下玩具示例:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) 2*x,S)
Run Code Online (Sandbox Code Playgroud)

它构建一个4x4稀疏对角矩阵,然后将每个元素乘以2.

现在说,不是将每个元素乘以常数2,而是将它乘以元素在原始矩阵中linear_index的索引,即假设保存每个元素的索引,它将是这样的:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) linear_index*x,S)
Run Code Online (Sandbox Code Playgroud)

但是,请注意上面的代码不起作用(linear_index未声明).

这个问题部分是由这样一个事实驱使blocproc,您可以访问到block_struct.location,有人会说引用的位置(〜指数)当前元素的范围内完整的对象(在这种情况下的图像):

block_struct.location: 一个双元素矢量[row col],指定输入图像中块数据的第一个像素(最小行,最小列)的位置.

Jon*_*nas 7

不,但您可以提供线性索引作为额外参数.

二者cellfunarrayfun接受多个输入阵列.因此,使用例如arrayfun,您可以编写

a = [1 1 2 2];
lin_idx = 1:4;
out = arrayfun(@(x,y)x*y,a,lin_idx);
Run Code Online (Sandbox Code Playgroud)

spfun遗憾的是,这不起作用,因为它只接受单个输入(稀疏数组).

您可以arrayfun改为使用,如下所示:

S = spdiags([1:4]',0,4,4);
lin_idx = find(S);

out = spones(S);
out(lin_idx) = arrayfun(@(x,y)x*y,full(S(lin_idx)),lin_idx);
%# or
out(lin_idx) = S(lin_idx) .* lin_idx;
Run Code Online (Sandbox Code Playgroud)

请注意,调用full不会让你陷入内存麻烦,因为S(lin_idx)0%稀疏.