2012-04-18 2 views
1

행렬 집합의 고유 값을 포함하는 셀 배열이 있습니다. 이 배열의 각 셀에서 첫 번째 값을 제거하고 행렬에 배치했습니다. 그런 다음이 값은 워터 마크 이미지를 기반으로 한 임계 값 집합을 통해 조작됩니다. 그런 다음 값의 행렬을 셀 배열로 재 변환했습니다. 이제는 이러한 새 셀의 값을 이전 배열의 해당 셀의 첫 번째 위치에 배치하려고합니다. 이 작업을 수행하는 방법에 대한 아이디어가 있습니까? 규칙을 기반으로 검색하고 바꾸는 데 사용되는 방법을 많이 보았지만 단순히 일대일 대체를 수행하는 방법은 없습니다. 나는 그것이 가능하기를 바랄뿐입니다.셀 배열의 각 셀의 첫 번째 값을 다른 셀 배열의 값으로 바꿉니다. MATLAB

기능 코드는 다음과 같습니다

function D = fun(D,W) 
    Q = 5; 
    [i,j] = size(D) 
    F = cellfun(@(c) c(1), D); % grab the first value from each cell 
    disp(F); % Debug check 
    for a = 1:i % Process the values 
     for b = 1:j 
     Z = mod(F(a,b),Q); 
     if W(a,b) == 0 
      if Z<(3*Q)/4; 
       F(a,b) = F(a,b)+Q/4-Z; 
      else 
       F(a,b) = F(a,b)+5*Q/4-Z; 
      end 
     else 
      if Z<Q/4; 
       F(a,b) = F(a,b)-Q/4+Z; 
      else 
       F(a,b) = F(a,b)+3*Q/4-Z; 
      end 
     end 
     end 
    end 
    disp(F); % Debug check 
    F = num2cell(F); % Make the new cell array 
    disp(F); % Debug Check 
    D{1,1} = cellfun(@(F) F{1,1}, F); % No clue what to do here 
    end 

답변

0

이 날 것으로 보인다 (마지막 줄은 문제가있다) 그 다음은 당신이 달성하고자하는 가장 간단한 솔루션 : 그래서

function D = fun(D,W) 
    Q = 5; 
    [i,j] = size(D) 
    F = cellfun(@(c) c(1), D); % grab the first value from each cell 
    disp(F); % Debug check 
    for a = 1:i % Process the values 
     for b = 1:j 
     Z = mod(F(a,b),Q); 
     if W(a,b) == 0 
      if Z<(3*Q)/4; 
       F(a,b) = F(a,b)+Q/4-Z; 
      else 
       F(a,b) = F(a,b)+5*Q/4-Z; 
      end 
     else 
      if Z<Q/4; 
       F(a,b) = F(a,b)-Q/4+Z; 
      else 
       F(a,b) = F(a,b)+3*Q/4-Z; 
      end 
     end 
     D{a,b}(1) = F(a,b) 
     end 
    end 

    end 

내가 한 것은 F를 조작하는 루프 내의 D {a, b}의 첫 번째 요소에 F (a, b)의 값을 할당하는 것이 었습니다. F의 요소가 어쨌든 독립적이기 때문에 할 수 있습니다. cellfun과 같은 matlab 내장 함수를 사용하면 항상 명시 적 루프보다 빠르지는 않습니다. 희망이 도움이됩니다.

관련 문제