gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:14:02 24 4
gpt4 key购买 nike

有什么方法可以检索 cellfunarrayfunspfun< 调用函数的元素的 index/ 行为? (即检索函数范围内元素的索引)。

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

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: A two-element vector, [row col], that specifies the position of the first pixel (minimum-row, minimum-column) of the block data in the input image.

最佳答案

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

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% 稀疏的。

关于matlab - 在 MATLAB 中检索 spfun、cellfun、arrayfun 等中的元素索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7741623/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com