matlab_bug记录

第一个bug:

clear all
clc
image = imread('mm.jpg');

R_image = image(:,:,1);
G_image = image(:,:,2);
B_image = image(:,:,3);
[n,~] = size(R_image);
%直接用 rand 或 randn 产生矩阵,得到的矩阵是可逆矩阵的概率为1.
%为了防止这种随机矩阵在数值上接近奇异性,为此我将他转换为正定矩阵
a = 1;               % a 取任意正数
A = rand(n);
A = A'*A+a*eye(n);

R_image_key = A * R_image;
G_image_key = A * G_image;
B_image_key = A * B_image;

image_key = cat(3,R_image_key,G_image_key,B_image_key);
%image_key = uint8(image_key);
imshow(image_key);

运行程序后:会出现这样的bug这里写图片描述
好吧,2016a的报错还是很人性化的。(我在机房用的2015b,它直接给我报错矩阵维度不一样。。。气死我了,都让我感觉到自己学到了假的高等代数)。其实吧,问题的不在于数学,因为:矩阵维度已经符合矩阵乘法的规定了。问题的数据类型不一致。所以不能进行矩阵乘法。加上强制类型转换就可以了。

R_image = double(image(:,:,1));
G_image = double(image(:,:,2));
B_image = double(image(:,:,3));

第一个bug:

matlab 判断 double(嗯,是小数,)数据不准确。

t = 0.2;    
i = 1;
disp(t-i+1 ~= t );

matlab返回的结果是1.好吧,小学生的知识都知道:应该返回0吧。
怎么解决呢?

t = 0.2;     i = 1;
a = t-i+1; b = t;
abs(a-b)<eps

总结一下:这两个问题虽然简单但是涉及的知识还是挺深的。不同的数据类型在计算机内存里的存储情况不同。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值