有没有办法检索由cellfun
,arrayfun
或spfun
调用的函数的元素的索引? (即检索函数范围内元素的索引)。
为简单起见,想象一下我有以下玩具示例:
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] 第一个像素(最小行,最小列)的位置 阻止输入图像中的数据。
答案 0 :(得分:7)
不,但您可以提供线性索引作为额外参数。
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%稀疏。
答案 1 :(得分:2)
您可以使用linear_index填充而不是值来创建稀疏矩阵。
创建A
:
A(find(S))=find(S)
然后使用A
和S
而不使用spfun,例如:A.*S
。这非常快。
答案 2 :(得分:1)
这很简单。只需制作一个单元格: C = num2cell(1:长度(S)); 然后: out = arrayfun(@(x,c)c * x,S,C)