当我尝试将-1与数组的元素相乘时,我得到了答案0.我不明白为什么

时间:2012-06-24 09:31:29

标签: matlab product

// final(i)= - 1 * A2(i);
这是我面临问题的地方。 虽然在任何迭代中A2都不是0,但在决赛中我仍然得到0。 这些只是d的十个值,只是为了说明我正在处理的是什么类型的值。

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,并没有给出任何问题。请提出你的建议。

1 个答案:

答案 0 :(得分:4)

问题来自于你不能将有符号和无符号的arithemetics与整数混合。反正不是直接的。你必须具体告诉你想要什么。您提及的行为零,因为您将uint16表示与(-1)相乘,默认情况下从double重新转换为uint16,其截断为零(0 )。请改用int16

我使用一些更好的变量名称制作了更干净的代码版本(尽管有些人可能不同意)。我发现使用数学上预期的“类型”作为变量名称(矩阵,向量等)的前缀很有用。即使数据结构非常小,您也应该养成预分配数据的习惯。我敢打赌,MATLAB编辑器可能会在右边缘发出恼人的警告,尖叫着你? :)

如果在final的值中设置了第16位,int16向量(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
% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

希望它有所帮助。