如何找到单元格中最大的 N 个元素的索引?

How to find indices of the largest N elements in a cell?

我是Matlab,我知道我可以用这个来获取一个单元格的最大数量

cell_max = cellfun(@(x) max(x(:)), the_cell);

但是,这有两个问题。首先,我还需要最大值的索引。其次,我不需要每个单元格的单个最大值,而是它的 N 个最大值。

Matlab 中的单元格是否可行?

更新: 我有一个像素矩阵,我通过 运行 某个输入图像文件上的过滤器获得该像素矩阵。然后,我从该矩阵将此矩阵拆分为多个图块,并希望仅保留每个图块的 N 个最大值,而所有其他条目应设置为零。 (所以我最后不需要索引,但它们允许我创建一个新的空单元格并复制大值。)

Tiles = mat2tiles(FilterResult, tileSize, tileSize);

如果我的用例有更简单的方法然后使用 mat2tiles script,我将不胜感激。

例程 cellfun 可以 return 您传入的函数的多个参数(请参阅文档)。因此,假设每个单元格都包含一个数值向量,您可以获得每个单元格的 N 个最大元素,如下所示:

% Using random data for the_cell    
the_cell{1, 1} = rand(1, 12);
the_cell{1, 2} = rand(1, 42);
the_cell{2, 1} = rand(1, 18);
the_cell{2, 2} = rand(1, 67);

% First sort elements in each cell in descending order and keep indices
[s, i] = cellfun(@(x)sort(x(:), 'descend'), the_cell, 'UniformOutput', false);

% Then, in each resulting `s` and `i` cell arrays, 
% take only the `N` first elements and indices
N = 4;
NLargestValues = cellfun(@(x)x(1:N), s, 'UniformOutput', false);
NLargestIndices = cellfun(@(x)x(1:N), i, 'UniformOutput', false);

注意:UniformOutput 设置为 false,因为输出不是标量。

更新

根据我们收到的您的更新和评论,您可以将所有操作放在某些 tileOperations 函数中:

% Operation to perform for each tile in the_cell array
function [tile] = tileOperations(tile, N) 
%[
    % Return unique sorted values of the tile
    v = unique(tile(:));

    % Find threshold index
    i = length(v) - N;
    if (i <= 1), return; end % Quick exit if not enough elements 

    % Set elements below threshold to zero
    threshold = v(i);
    tile(tile < threshold) = 0.0;    
%]
end

然后您可以仅调用 cellfun 一次以对 the_cell 中的所有图块重复应用操作:

filteredTiles = cellfun(@(x)tileOperations(x), the_cell, 'UniformOutput', false);