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

时间:2011-10-12 14:25:35

标签: matlab

有没有办法检索由cellfunarrayfunspfun调用的函数的元素的索引? (即检索函数范围内元素的索引)。

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

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) 2*x,S)

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

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

S = spdiags([1:4]',0,4,4)
f = spfun(@(x) linear_index*x,S)

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

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

  

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

3 个答案:

答案 0 :(得分:7)

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

cellfunarrayfun都接受多个输入数组。因此,例如, 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%稀疏。

答案 1 :(得分:2)

您可以使用linear_index填充而不是值来创建稀疏矩阵。

创建A

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

然后使用AS而不使用spfun,例如:A.*S。这非常快。

答案 2 :(得分:1)

这很简单。只需制作一个单元格: C = num2cell(1:长度(S)); 然后: out = arrayfun(@(x,c)c * x,S,C)