如何找到单元格中最大的 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);
我是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);