2016-02-27 2 views
2

У меня есть ячейка 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 

Но с этим кодом матрица Teste только 100х100. И я хочу прикрепить все матрицы testes, и в конце концов мне нужна матрица размером 500x500. Как я могу это сделать?

+1

Используйте цикл for или cellfun, независимо от того, что вы предпочитаете. – Daniel

+0

У меня уже есть режим каждой ячейки. Но как я могу сравнить значение каждой матрицы 100x100 с соответствующим режимом ячейки? –

+1

Когда вы задаете вопросы, проясните, что вы уже поняли и что вам нужно. Теперь вы получили ответ и комментарий, объясняющий, как делать то, что вы уже реализуете. – Daniel

ответ

4

Edit: Обновленный ответ в соответствии с обновлением вашего вопроса

конденсированного раствора (+):

%// 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 является матрицей 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. 

Наконец, если вы хотите конвертировать массив ячеек 5x5teste (с каждой ячейкой, содержащей 100x100 логических записей) до единственной логической матрицы 500x500, вы можете использовать команду cell2mat, примененную к матрице ячеек 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); 

Выходной сигнал будет содержать значение 5x5. ng режим для каждого набора данных 100x100.

+1

Почему uniformoutput false? Функция возвращает скаляр. +1 для хорошего ответа на исходный вопрос до его редактирования. – Daniel

+0

У меня уже есть режим каждой ячейки. Но как я могу сравнить значение каждой матрицы 100x100 с соответствующим режимом ячейки? –

+0

@ Даниэль Ах, плохая авто-привычка, спасибо, что указали это. – dfri

Смежные вопросы