细胞中的操作

Operations in cells

我有一个 5x5 的单元格,每个单元格有 100x100 个单个数据。我想计算每个矩阵 100x100 中的模式,然后根据模式执行一些操作。我怎样才能做到这一点?

单元格:

每个单元格都有这样的 100x100 数据:

我有这段代码可以计算每个单元格的模式,现在我想将 100x100 矩阵上的每个值与相应的单元格模式进行比较。

I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
for i=1:5
    for j=1:5
        mode_cell = mode(c{i,j}(:))
    end
end

我做了这个代码:

modes = cellfun(@(x) mode(x(:)), c, 'UniformOutput', false);
modes = cell2mat(cellfun(@(x) mode(x(:)), c, 'UniformOutput', false));
for i = 1 :5
for j =1 :5
    for i2=1 :100
        for j2=1 :100
            cell = c{i,j};
            if cell(i2,j2)<modes(i,j)
                teste(i,j)=0;
            else
                teste(i,j)=1;
            end
        end
    end
end
end

但是使用这段代码矩阵teste只有100x100。我想附加所有睾丸矩阵,最后我想要一个 500x500 矩阵。我该怎么做?

编辑:根据您问题的更新更新答案

浓缩液(+):

%// data
I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
    %// 5x5 cell matrix with 100x100 data entries

%// solution
teste = cell2mat(cellfun(@(x) bsxfun(@ge, x, mode(x(:))), c, 'UniformOutput', false));
    %// 500x500 logical matrix

解释:

如前所述(请参阅下面的先前答案),使用 cellfun 命令,但包括 'UniformOutput', false' 名称-值对,这样生成的 modes5x5 cell 矩阵(而不是值矩阵)。计算模式后,使用后续 cellfun 调用根据您的规范计算逻辑。

%// data
I = imread('DSM.tif');
c = mat2cell(I, [100,100,100,100,100], [100,100,100,100,100])
    %// 5x5 cell matrix with 100x100 data entries

%// modes: 5x5 cell matrix with single value entries (mode)
modes = cellfun(@(x) mode(x(:)), c, 'UniformOutput', false);

%// teste: 5x5 cell matrix with 100x100 logical (0/1) entries 
teste = cellfun(@ge, c, modes, 'UniformOutput', false);

teste中的逻辑描述,对于每个100x100数据块中的每个值,如果该值小于对应块的模式值:

0 : values in block less than block mode,
1 : values greater or equal to block mode.

最后,如果要将 5x5 元胞数组 teste(每个元胞包含 100x100 个逻辑条目)转换为单个 500x500 逻辑矩阵,您可以使用 cell2mat 命令,应用于单元格矩阵 teste:

testeSingleValueMatrix = cell2mat(teste)
    %// 500x500 logical matrix

现在,通过在单个 cellfun 中包含一个 bsxfun 命令,我们可以将上面的内容归结为一行;上面(+)给出的浓缩解,即

teste = cell2mat(cellfun(@(x) bsxfun(@ge, x, mode(x(:))), c, 'UniformOutput', false));
    %// 500x500 logical matrix

在编辑原始问题之前回答(计算模式并分配到 value 矩阵)

你可以使用cellfun命令

myCellMatrix = ... %// 5x5 cell matrix with 100x100 data entries
modes = cellfun(@(x) mode(x(:)), myCellMatrix);

输出将是一个 5x5 值矩阵,其中包含每个 100x100 数据集的模式。