2016-02-27 61 views
2

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

细胞: enter image description here

每个单元具有100×100的数据是这样的:enter image description here

我有这样的代码,计算在每个单元中的模式,现在我想每个值上100×100矩阵与对应的比较细胞模式。

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 

但有了这个代码的矩阵泰斯特只有100×100。我想附上所有的睾丸矩阵,最后我想要一个500x500的矩阵。我怎样才能做到这一点?

+1

使用for循环或cellfun,无论你喜欢什么。 – Daniel

+0

我已经有每个单元的模式。但是,我怎么能比较每个矩阵100x100的值与相应的单元模式? –

+1

当提问时,请说明您已经了解的内容以及您的需求。现在您收到了一个答案和一条评论,解释了如何执行您已经实施的内容。 – Daniel

回答

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是矩阵(而不是值矩阵)。在计算模式之后,请使用随后的调用来按照您的规范计算逻辑。

%// 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 

回答以前原来的问题的编辑(计算模式并分配成矩阵)

可以利用cellfun命令

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

输出将是一个5x5值矩阵containsi每个100x100数据集的模式。

+1

为什么uniformoutput false?该函数返回一个标量。对原始问题进行编辑前的+1,以获得最佳答案。 – Daniel

+0

我已经有每个单元的模式。但是,我怎么能比较每个矩阵100x100的值与相应的单元模式? –

+0

@丹尼尔啊,一个不好的习惯,谢谢你指出这一点。 – dfri