2016-02-27 104 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