从2013数学建模B题碎纸片拼接问题看递归和迭代思想

目录

1.递归实例说明

2.迭代实例说明

3.迭代思想在碎纸片拼接赛题的运用


1.递归实例说明

斐波那契数列可以使用递归,也可以使用数列的通项公式,但是这个地方建议使用数列的通项公式,因为这个递归的深度过大这个结果很难运行出来;

1-100数据求和,这个也是不断的进行递归的过程,我们是自己定义了一个函数,然后在另外一个文件里面去调用这个函数,100+sum(99),然后这个99回去调用99+sum(98),就按照这个顺序不断地递归下去就可以了;

2.迭代实例说明

迭代求解方程的根的取值,利用的就是零点的存在性定理;

3.迭代思想在碎纸片拼接赛题的运用

关于这个赛题的详细的信息可以去数学建模的官网上面去寻找,就是碎纸片的拼接问题,这个结合该赛题介绍迭代递归的思想的运用;

刚开始就是去读取这个份碎片的相关的信息,这个是利用的循环对于这个图片的索引进行相关的命名,url就是这个图片的相关的地址,顺着这个地址,我们可以直接去找到这个图片的相关的信息;

因为这个matlab的索引是从1开始的,所以我们在设计这个读取数据信息的时候,第一个参数图片的编号,是从1开始的,所以我们把这个j+1作为这个matlab里面的索引,让这个索引符合matlab的编程规范;

f就是一个三维数组,第一个参数表示的就是这个图片的编号,第二个表示这个图片的行数,第三个表示这个图片的列数,我们可以把这个f三维数组理解为这个空间里面的三维坐标;

hs就是读取这个图片的行数,ls就是读取这个图片的列数,hs求解的时候第二个参数使用冒号表示的就是所有的行,第三个参数使用冒号表示的就是所有的列;

下面的还是一个for循环进行求解,两个sum函数,一个是对与外层求解,一个是对于内层求解,就是可以理解为这个显示对于每一行进行求和,再去对于这个得到的一维数组向量再次求和就可以知道这个图片的左边的两列的属性值,如果和hs*2*255相同就说明这个碎片是这个图片的最左边;

我们找到最左边的碎片之后,就需要找到这个最左边的图片色差最小的图片与之拼接,我们需要去挨个的进行判断,看一看哪一个碎片和我们的一致的碎片的这个色差的数值是最小的,比如我们的8号碎片可以去和最左边的拼接上,然后我们把这个1和8碎片作为基准,让上下的没有匹配上去的碎片进行匹配,这个不断的更新,不断地选择匹配的过程实际上就是一个迭代的过程;

把筛选的图片的信息同步到一个拼接矩阵里面去,最后使用循环的方式把这个图片放到fig_all这个矩阵里面,使用imshow函数把这个图像信息显示出来;

%2013B题的图片的拼接技术

clear%随书附带的第五章附件中的cx52.m

tpgs=19;%图片个数

for j=0:tpgs-1

    if(j<10)
            index=['00' num2str(j)];
    else
            index=['0' num2str(j)];
    end

    %当前路径下面的图片

    uri=['.\' index '.bmp'];         %获取图片地

    %matlab从1开始访问,所以这个就是1-19
    f(j+1,:,:)=imread(uri);          %读入图片

end

%读取的图像的行数
%第一个是编号信息,后面的两个参数表示的就是图像的行数和列数
hs=length(f(1,:,1));

%读取的图像的列数
ls=length(f(1,1,:));


%获取最左侧图片

pjjz=[];%拼接矩阵

for i=1:tpgs
    %每张图片的最左边的两列进行求和
    if sum(sum(f(i,:,1:2)))==hs*2*255  %图像最左侧两列为纯白色
        pjjz=[pjjz i];
    end
end


while length(pjjz)<tpgs
  sc=inf;%初始色差


  for i=1:tpgs

      %是拼接矩阵的元素
    if sum(i==pjjz)==0%在未拼接的图片中寻找
        fig_right=f(i,:,1);

        %pjjz(length(pjjz))表示拼接好的最右边的图片

        %ls是读取的图像的列数
        fig_left=f(pjjz(length(pjjz)),:,ls);
        x=[fig_right;fig_left]';

        x=double(x);%强制类型转换,否则无法计算相关度
        scx=sum(abs(x(:,1)-x(:,2)));
        %保留色差最小的图片的编号


      if scx<sc
            sc=scx;
            next_fig=i;
      end
    end
  end


  
  %把这个编号输入到这个拼接矩阵里面去
  pjjz=[pjjz next_fig];
end


fig_all=[];

for i=1:tpgs
    fig1(:,:)=[f(pjjz(i),:,:)];
    fig_all=[fig_all fig1];
end

%对于拼接之后的图像进行显示出来
imshow(fig_all)

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2013数学建模B题是关于纸片拼接问题。这个问题的目标是通过拼接多张长方形纸片来覆盖一个特定形状的图案。 要解决这个问题,我们需要编写一段代码。首先,我们需要引入相关的库,如numpy和matplotlib。然后,我们可以定义一个函数用来计算纸片拼接方式。 在该函数中,我们可以使用一个二维数组来表示拼接图案的形状。对于每个图案,我们可以定义它的位置和方向。然后,我们可以使用循环来遍历所有可能的纸片拼接方式。 在每个循环迭代中,我们可以计算拼接图案的完整性。如果图案被完全覆盖,则可以将这个拼接方案添加到结果列表中。 最后,我们可以使用matplotlib库将所有的完整拼接方案可视化。这样可以方便我们理解和分析结果。 在编写代码时,我们应该注意到以下几点: 1. 我们需要采用递归或者回溯的方式来处理多次纸片拼接。 2. 我们可以使用numpy库来处理矩阵运算,提高计算效率。 3. 我们需要使用循环来遍历不同的纸片位置和方向,并选择合适的拼接方式。 总结起来,通过设计合适的算法和编写相应的代码,我们可以有效地解决2013数学建模B题中纸片拼接问题。这将帮助我们找到能够覆盖特定图案的纸片拼接方式,并且便于进一步研究和分析。 ### 回答2: 2013数学建模B题是关于纸片拼接问题纸片是由一系列正方形格子组成的,每个格子有两种颜色,要求将纸片拼接成一个整体,并且要求相邻格子的颜色不能相同。 要解决这个问题,可以使用代码来进行模拟拼接的过程。首先,可以定义一个二维数组来表示纸片,数组的每个元素代表一个格子,可以用0和1来表示两种颜色。然后,可以编写一个函数来检查相邻格子的颜色是否相同,如果相同则返回False,否则返回True。 接下来,可以编写一个递归函数来进行拼接操作。从纸片的某一个位置开始,分别尝试将下一个格子放置在其上、下、左、右四个方向上,然后递归调用函数进行拼接。在递归函数中,需要进行边界条件的判断,避免越界。如果成功拼接完所有的格子,则找到了一个有效的拼接方案,可以将其记录下来。 最后,在主函数中调用递归函数,遍历所有可能的起始位置,找到所有有效的拼接方案。在找到方案的同时,可以统计拼接方案的数量,并将每个方案输出,以供分析和参考。 总的来说,通过编写纸片拼接的代码,可以对2013数学建模B题进行求解。该代码通过模拟纸片拼接的过程,使用递归函数来穷举所有可能的拼接方案,并找到所有有效的方案。这样就可以是解决问题,得到了纸片拼接的结果。 ### 回答3: 2013数学建模B题是关于纸片拼接问题。在这个问题中,我们需要编写一个代码来实现给定纸片拼接方案。 首先,我们需要将纸片的形状和尺寸输入到代码中。可以使用一个矩阵来表示每个纸片的形状,其中0表示没有纸片,1表示有纸片。例如,对于一个4x4的纸片,我们可以使用一个4x4的矩阵来表示它的形状。 接下来,我们需要定义拼接的规则。可以使用一些条件来限制纸片拼接方式。例如,我们可以定义两个纸片只能拼接在相邻的边上,而不能拼接在角上。 然后,我们可以编写一个递归函数来实现纸片拼接。这个函数将遍历每个位置,检查当前位置是否为空,如果为空,则尝试将其他纸片拼接在这个位置上。如果成功拼接,则递归调用函数来尝试将下一个纸片拼接在剩余的空位置上。如果不能拼接,则回溯到上一个位置,并尝试其他的拼接方式,直到找到合适的拼接方案或所有的尝试都失败为止。 最后,我们可以输出拼接后的纸片。可以将纸片的形状打印出来,或者保存成一个矩阵,其中1表示有纸片,0表示没有纸片。 对于该问题的解决方案,需要根据实际情况来具体编写代码。以上是一个简单的思路和步骤,可以根据问题的具体要求来进一步完善代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值