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

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

猜你喜欢

转载自blog.csdn.net/qq_37366291/article/details/80464090