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

在MATLAB中检索spfun、cellfun、arrayfun等中的元素索引,matlab,Matlab,有没有办法检索元素的索引,由cellfun、arrayfun或spfun调用的函数在该元素上运行?(即检索函数范围内元素的索引) 为了简单起见,假设我有以下玩具示例: S = spdiags([1:4]',0,4,4) f = spfun(@(x) 2*x,S) 它构建一个4x4稀疏对角矩阵,然后将每个元素乘以2 现在,我不想将每个元素乘以常量2,而是想将它乘以元素在原始矩阵中的索引,也就是说,假设linear\u index包含每个元素的索引,它会是这样的: S = spdiags([1:4

有没有办法检索元素的索引,由
cellfun
arrayfun
spfun
调用的函数在该元素上运行?(即检索函数范围内元素的索引)

为了简单起见,假设我有以下玩具示例:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) 2*x,S)
它构建一个4x4稀疏对角矩阵,然后将每个元素乘以
2

现在,我不想将每个元素乘以常量
2
,而是想将它乘以元素在原始矩阵中的索引,也就是说,假设
linear\u index
包含每个元素的索引,它会是这样的:

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) linear_index*x,S)
但是,请注意,上面的代码不起作用(
linear_index
未声明)

这个问题的部分原因是
blocproc
允许您访问
block_struct.location
,您可以认为它引用了完整对象(本例中为图像)中当前元素的位置(~索引):

block\u 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);
不幸的是,这不适用于
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;

请注意,调用
full
不会导致内存问题,因为
S(lin_idx)
是0%稀疏的

您可以使用线性索引填充而不是值来创建稀疏矩阵

创建
A

A(find(S))=find(S)

然后在不使用spfun的情况下使用
A
S
,例如:
A.*S
。这运行得非常快。

很简单。只需制作一个单元,如下所示: C=num2单元(1:长度); 然后:
out=arrayfun(@(x,c)c*x,S,c)

最后一行应该是
A(sub2ind(i,j))=find(S)
。否则,您将无法获得正确的线性索引。