1

一連の行列の固有値を含むセル配列があります。この配列の各セルから最初の値を削除し、それらを行列に配置しました。これらの値は、透かし画像に基づく一連のしきい値を介して操作されます。次に、値の行列をセル配列に再変換しました。これらの新しいセルの値を、古い配列のセルの対応する最初の場所に配置したいと思います。これを行う方法についてのアイデアはありますか?ルールに基づいて検索と置換を行う方法は数多く見てきましたが、単純に 1 対 1 の置換を行う方法はありません。それが可能であることを願っています。

機能コードは次のとおりです:(最後の行に問題があります)

    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
4

1 に答える 1

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(a,b) の値を、F を操作するループ内の D{a,b} の最初の要素に代入するだけでした。F の要素はとにかく独立しているため、これを行うことができます。いずれにせよ、 matlab の組み込み関数の使用cellfunは、明示的なループよりも常に高速であるとは限りません。お役に立てれば。

于 2012-04-30T14:12:11.097 に答える