MATLAB基本程序设计(笔记)

  今天是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   %输出
  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值