matlab变量无法累加

2024-12-14 00:01:17
推荐回答(4个)
回答1:

您遇到的问题很基础很普遍。
(1)为什么sum不能累加到大于255?
sum在定义的时候默认是double型的,但是由于你的m文件里的这句:
sum=sum+I(j+direction(k,2),i+direction(k,1))
导致sum类型退化为了uint8型,而uint8是unsigned int 8bits的简写,学过二进制就会明白这种类型表示的范围为0-255,这就是为什么sum值不能累加到大于255的原因。
(2)为什么sum类型会退化为uint8?
这是由于读入图像后得到的矩阵是unit8的(灰度图像,所以使用uint8刚好表示了0-255所有灰度级),这是使用你的程序得到的workspace下的变量类型:
>>whos
Name Size Bytes Class Attributes

I 570x760 433200 uint8
I1 570x760 3465600 double
count 1x1 8 double
direction 8x2 128 double
h 1x1 8 double
i 1x1 8 double
j 1x1 8 double
k 1x1 8 double
sum 1x1 1 uint8【注意】
w 1x1 8 double
(3)问题解决
读入图像之后进行强制转化为double:
I=double(I);
即可解决问题。
PS:二楼正解,楼主没看明白而已。

(4)你以后可能遇到的问题预测
根据你的问题,预测你以后肯定会遇到这个问题:
处理之后的图像通过inshow()函数显示时,图像异常。
这也是跟变量类型有关的,拿你最终输出的I1来说,要进行正常显示需要进行强制转化:
imshow(uint8(I1));

PS:一楼正解,楼主没看懂而已

回答2:

一维数组的话直接sum(b)
二维数组要叠加所有元素用sum(b(:))
要叠加行或列用sum(b,1)或sum(b,2)
----------------
∑∑bibj这一项,如果b是行向量的话可以用
sum(sum(b'*b))
或者
bb=b'*b;sum(b(:))
列向量的话吧b'*b换成b*b'

回答3:

I(j+direction(k,2),i+direction(k,1))
首先这个在加到sum前不等于0
还有就是是输入
whos sum
查看sum的数据类型是不是int

%sum=sum+2
前面带有百分号,属于comment,不会被运行的!
改为
sum=sum+2

回答4:

sum=sum+uint32(I(j+direction(k,2),i+direction(k,1)))

sum=sum+double(I(j+direction(k,2),i+direction(k,1)))