1

// final(i)=-1*A2(i);
これは私が問題に直面しているところです。A2 はどの反復でも 0 ではありませんが、最終的には 0 になります。これらは、私が扱っている値のタイプを理解するためだけに、d の 10 個の値です。

d=[63820
   63594
   63382
   63123
   62921
   62712
   62536
   62350
   62129
   61914
   61668];

d=bin2dec(b);
a=bitget(d,16);
for i=1:10
    if (a(i)==1)  
        C1(i)=bitcmp(uint16(d(i)));
        A1(i)=C1(i)+1;
        A2=A1';
        final(i)=-1*A2(i);
    else  
        final(i)=d(i);
    end
end      

コードの別の部分で -1 を掛けていますが、問題はありません。あなたの提案をよろしくお願いします。

4

1 に答える 1

4

問題は、符号付きおよび符号なしの算術演算を整数と混在させることができないという事実から生じます。とにかく直接ではありません。何が欲しいかを具体的に伝える必要があります。あなたが言及した行は、デフォルトで から にリキャストされ、ゼロに切り捨てられるuint16表現を乗算するため、ゼロになります( )。代わりに使用してください。(-1)doubleuint160int16

いくつかのより良い変数名を使用して、コードのよりクリーンなバージョンを作成しました (同意しない人もいるかもしれませんが)。数学的に意図された「型」を変数名 (行列、ベクトルなど) の接頭辞として使用すると便利です。また、データ構造が非常に小さい場合でも、データを事前に割り当てる習慣を身に付ける必要があります。MATLAB エディターが右マージンに迷惑な警告を表示して、あなたに怒鳴りつけているのではないでしょうか? :)

の値で 16 番目のビットが設定されている場合、finalベクトル (int16ベクトル) には 2 の補数 (負) の値が含まれている必要がありますvec_d。また、何A2のためにあるのかわからないので、削除しました。

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
vec_d = [
   63820
   63594
   63382
   63123
   62921
   62712
   62536
   62350
   62129
   61914
   61668
];
vec_d = uint16(vec_d);

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% extract 16th bit:
vec_a = bitget(vec_d, 16);

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
% preallocate other datastructures:
vec_C1 = zeros(size(vec_a), 'uint16');
vec_A1 = zeros(size(vec_a), 'uint16');
vec_final = zeros(size(vec_a), 'int16');

% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
for num_k = 1:numel(vec_a)
    if (vec_a(num_k) == 1)  
        vec_C1(num_k) = bitcmp(uint16(vec_d(num_k)));
        vec_A1(num_k) = vec_C1(num_k) + 1;
        vec_final(num_k) = (-1) * int16(vec_A1(num_k));
    else  
        vec_final(num_k) = vec_d(num_k);
    end
end
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

それが役に立てば幸い。

于 2012-06-24T12:24:40.823 に答える