在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)
。否则,您将无法获得正确的线性索引。