单元格中的操作

时间:2016-02-27 17:42:31

标签: matlab matrix cells

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

细胞: enter image description here

每个单元格都有100x100这样的数据:enter image description here

我有这个代码来计算每个单元格的模式,现在我想将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

但是使用此代码,矩阵测试仅为100x100。我想附加所有睾丸矩阵,最后我想要一个500x500矩阵。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

编辑:根据您的问题更新

更新答案

简明解决方案(+)

%// 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'名称 - 值对,以便生成的modes为{{1} } cell 矩阵(而不是值矩阵)。计算模式后,使用后续的5x5调用来根据您的规范计算逻辑。

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逻辑矩阵,您可以制作使用cell2mat命令,应用于单元格矩阵500x500

teste

现在,通过在单testeSingleValueMatrix = cell2mat(teste) %// 500x500 logical matrix 中包含bsxfun命令,我们可以将上述内容归结为一行;上面cellfun中给出的浓缩解,即

(+)

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

您可以使用teste = cell2mat(cellfun(@(x) bsxfun(@ge, x, mode(x(:))), c, 'UniformOutput', false)); %// 500x500 logical matrix 命令

cellfun

输出将是myCellMatrix = ... %// 5x5 cell matrix with 100x100 data entries modes = cellfun(@(x) mode(x(:)), myCellMatrix); 值矩阵,其中包含每个100x100数据集的模式。