今天是10.24,祝各位亲节日快乐!最近开始学MATLAB用于数字图像处理,下面一些基本程序和注意点仅当笔记,若能帮助到有需要的人当然最好不过了,有错还望指正,谢谢!
注意点与笔记:(1)MATLAB中除法(’/’)即使是两个整数相除,有小数也会保留小数不像我们所学语言(如c,java等)整除;
(2)文件中读取图片:
clc;
clear all;
close all;
[filename pathname] = uigetfile('*.*,*.jpg','选择文件','*.jpg');
im = imread([pathname filename]);
(3)图片运算前是否需要先转化为灰度图像,以及图像运算前应该使用im2double()函数,否则后面图像运算会出错。
im = rgb2gray(im); %图像灰度化
im = im2double(im); %图像像素转化为double类
(4)写代码是有while,if,for即对应一个end,不要留到最后才补上,并且把每个循环条件写上,以防内外循环出错或死循环。
1、一个正整数恰好等于它的所有正整数因子之和,这个数就称为完数,如:6的因子1, 2, 3,而6 = 1 + 2 + 3,因此6就是一个完数,编程找出2000内的所有的完数,并按格式:6 = 1 + 2 + 3输出。
clc;
close all;
clear all;
fac = 6;
while fac <=2000
i = 1;
sum = 0;
num = fac;
s = [int2str(fac),' = '];
while i <= fac/2
if mod(fac,i) == 0
sum = sum + i;
if i < fac/2
s = [s,int2str(i),' + '];
else
s = [s,int2str(i)]; %注意末尾状态
end
end
i = i + 1;
end
if sum == fac
disp(s);
end
fac = fac + 1;
end
%结果如下:
% 6 = 1 + 2 + 3
% 28 = 1 + 2 + 4 + 7 + 14
% 496 = 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248
2、编程实现:将一个整数分解成一个其因子的乘积形式输出。如: -60 = -2 * 2 * 3 * 5,90 = 2 * 3 * 3 * 5
clc;
close all;
clear all;
num = input('请输入分解因数的整数:');
s='';
if num < 0
s = [s,int2str(num), ' = - '];
num = -1 * num;
end
fac = 2;
while fac<num
if mod(num,fac) == 0
num = num /fac;
s = [s,int2str(fac),'*'];
else
fac = fac + 1;
end
end
s = [s,int2str(fac)];
disp(s);
3、编写程序,输入注数(大于等于1)的双色球彩票随机生成程序。(此方法借鉴网上,重点看注释看懂)
clc;
clear all;
close all;
k=0;
%红球从1-33中选6个数,先乱序随机抽出一个数,然后剔除后如此往复,直到获得6个数。得到数字必须满足的条件是
%相邻2个球之差必须有2或者1,但是又不能多于3个。
while(k<=0||k>=4)
k=0;
A = 1:33;
for i = 1:6
A=randperm(numel(A)); %randperm是matlab函数,功能是随机打乱一个数字序列。numel(A)该函数用于计算数组中满足指定条件的元素个数。
Red_ball(i) = randsrc(1,1,A);%randsrc随机抽取
A(find(A==Red_ball(i))) = []; %b=find(a),a是一个矩阵,查询非零元素的位置
end
Red_ball = sort(Red_ball);
for j = 1:5
Test = Red_ball(j+1)-Red_ball(j);
if Test==2||Test==1
k = k+1;
end
end
end
B = 1:16;
B=randperm(numel(B));
Blue_ball = randsrc(1,1,B);
disp('红球为:')
disp(Red_ball)
disp('蓝球为:')
disp(Blue_ball)
4、“数学黑洞问题”:任意一个4位自然数,将组成该数的各位数字重新排列,形成一个最大数和一个最小数,之后两数相减,其差仍为一个自然数。重复进行上述运算,最终会出现一个神秘的数,请编程输出这个神秘的数。
clc;
close all;
clear all;
num = input('请输入一个4位自然数:');
before = 0;
while num~=before %不等于
four = fix(num/1000);
three = fix(mod(num/100,10));
two = fix(mod(num/10,10));
one = fix(mod(num,10));
arr = [one,two,three,four];
arr = sort(arr);
little= arr(1)*1000 + arr(2)*100 + arr(3)*10 +arr(4);
big= arr(4)*1000 + arr(3)*100 + arr(2)*10 +arr(1);
%disp([int2str(big),' ',int2str(little)]);
before = num ;
num = big - little; %相当于c语言的迭代
%disp(int2str(num));
end
disp(int2str(before));
%答案6174
5、有一个卡车司机肇事后想逃跑,但是被三个人看见了其车牌号,但是都没看全,甲说:车牌的前两位是一样的,乙说:车牌的后两位是一样的,但与前两位不一样,丙说:车牌是一个数字的平方,请编写一个程序计算该车牌号是多少?假设计车牌为5位数字。(优化算法,最多1000次)
clc;
close all;
clear all;
for i = 0:9
for j = 0:9
for k = 0:9
if i==k continue;
end
cnt = i*10000 + i*1000 + j*100 + k*10 + k ;
%disp([int2str(i),' ',int2str(j),' ',int2str(k)]);
if mod(cnt,sqrt(cnt))==0
fprintf('%05d\n',cnt);
end
end
end
end
%答案:
% 00144
% 22500
% 44100
6、编程实现:输入n个数,将其中重复的数据只保留1个,并输出结果。如:数组num[] = {1, 2, 2, 4, 3, 2},2是重复的数据,去除之后num[] = = {1, 2, 4, 3}
clc;
clear all;
close all;
n = input('请输入元素个数:');
A = [];%构造两个空数组
B = [];
while n~= 0
num = input('请输入元素:');
A = [A,num];
n = n -1;
end
for i = 1:length(A)
if ismember(A(i),B) == 0;
B = [B,A(i)]; %往数组中加数
end
end
B %输出
7、 编程实现:输入一串字符,统计这串字符中单词的个数。单词是指:至少包含1个字符的子字符串,且该字符子串中无空格,单词之间用空格进行分隔。(采用映射为两种字符的思想,此处映射为1,0)
clc;
close all;
clear all;
SA = input('请输入字符串:','s');
SB = [];
for i = 1:length(SA)
if SA(i) >= 'A' && SA(i)<='Z' || SA(i) >='a' && SA(i) <= 'z'
SB = [SB,1];
else
SB = [SB,0];
end
end
count = 0;
for j = 1:length(SB)
if j<length(SB)
if SB(j)==1 && SB(j+1)==0
count = count + 1;
end
else
if SB(j)==1
count = count + 1;
end
end
end
count
8、 将数组a中的n个元素后移m位,移出的m位顺序存放在数组的前位。如a[] = {1, 2, 3, 4, 5, 6 7, 8, 9, 10},后移3位,则a[] = {8, 9, 10, 1, 2, 3, 4, 5, 6, 7}
clc;
clear all;
close all;
n = input('请输入元素个数:');
m = input('请输入后移的位数:');
A = [];
B = [];
temp = n;
while n~= 0
num = input('请输入元素:');
A = [A,num];
n = n -1;
end
m = mod(m,temp);
for i = temp-m+1: temp
B = [B,A(i)];
end
for j = 1 : temp-m
B = [B,A(j)];
end
B %输出