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