2012-04-18 41 views
1

行列の固有値を含むセル配列があります。私はこの配列内の各セルから最初の値を削除し、行列に配置しました。これらの値は、次いで、透かし画像に基づく閾値のセットを介して操作される。私は値の行列をセル配列に再変換しました。私は今、これらの新しいセルの値を、古い配列のセルの対応する最初の位置に配置したいと思います。これを行う方法に関するアイデア?ルールに基づいて検索や置換を行う方法はかなりありますが、単に1対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)の値を代入することでした。 cellfunのような組み込み関数matlabを使うのは、とにかく明示的なループよりも速いとは限りません。お役に立てれば。

関連する問題