有什么办法来检索索引上通过调用的函数的元素cellfun,arrayfun或spfun行为?(即检索函数范围内元素的索引).
为简单起见,想象一下我有以下玩具示例:
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],指定输入图像中块数据的第一个像素(最小行,最小列)的位置.
不,但您可以提供线性索引作为额外参数.
二者cellfun并arrayfun接受多个输入阵列.因此,使用例如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%稀疏.