二维坐标离散化

离散化的思想就是将分布大却数量少(即稀疏)的数据进行集中化的处理,这样可以有利于程序的空间与时间,能减少遍历次数与空间储存。

然而虽然我会了思想今天问了翔神半天才知道怎么实现。。

其实实现的方式与口述的角度还是有所不同。

思想理解起来其实道理很简单,如坐标(3,2000),(10005,31),(10006,5)离散至新图,先看x坐标,3个点有3,10005,10006,离散后即1,3,4; 3 -> 1,由于10005与3不是连续的两个数故10005 -> 3,又10006与10005是连续的两个数(即相邻)故10006 -> 4,同理看y坐标,3个点有2000,31,5,按上面的思想离散的结果即5 -> 1,31 -> 3,2000 -> 5。离散后三个点坐标为(1,5),(3,3),(4,1)

代码实现的方式并不是很简单。先用 结构体or两个数组(这里我用的结构体 node )存下需要离散的点(x,y),再用一个数组 x[ ]存所有点的x坐标,用数组 y[ ]存所有点的y坐标,为了能按顺序离散以及提高效率,将在数组 x[ ],y[ ]中加入原图的最小最大值来表示图的边界,然后排序并去重。得到处理后数组长度len1,len2。

设一个tot用来表示新图的下标,然后就for i in len一遍判断前后两个数如果只相差1说明连续,则tot++就可以用一个数组 nx[ ],ny[ ]存 下一个点,否则可以存一个中间值。这样就得到了一个原坐标与离散坐标的一个映射关系,这种映射关系即nx[ ],ny[ ]里每个下标与相应值。

在按照这个映射关系将一开始存在node里的x,y用lower_bound(nx,nx+tot,node[ i ].x) - nx得到对应下标,y同理省略,存入新图。

综上离散完毕。

 

附上离散板子

注意最后存的数组ma[][]中的maxn应该是2*点数+5。

 

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 点数;//这个就是离散完的图的大小
 5 const int maximum = 离散前图的最大边界;
 6 struct Node
 7 {
 8     int x,y;
 9 }node[maxn];
10 int x[maxn], y[maxn];
11 int  nx[maxn], ny[maxn];
12 int m[maxn*2+5][maxn*2+5];
13 void discrete(int n)
14 {
15     int tot1 = 0,tot2 = 0;
16     //x y数组下标从1开始
17     //一般1是图的最小边界,最大边界maximum看题意自己定吧。
18     x[0]=1,x[n+1]=maximum;
19     y[0]=1,y[n+1]=maximum;
20     sort(x,x+n+2);//数组长n+2
21     sort(y,y+n+2);
22     int len1 = unique(x,x+n+2) - x;
23     int len2 = unique(y,y+n+2) - y;
24     //离散x轴
25     for(int i = 0; i < len1;i++)
26     {
27         if(i&&x[i]!=x[i-1]+1)nx[tot1++]=x[i]-1,nx[tot1++]=x[i];
28         else nx[tot1++]=x[i];
29     }
30     //离散y轴
31     for(int i = 0; i < len2;i++)
32     {
33         if(i&&y[i]!=y[i-1]+1)ny[tot2++]=y[i]-1,ny[tot2++]=y[i];
34         else ny[tot2++]=y[i];
35     }
36     //用映射关系将需离散的点放入离散图中
37     for(int i = 0;i < n;i++)
38     {
39         int newx=lower_bound(nx, nx+tot1,node[i].x)-nx;
40         int newy=lower_bound(ny, ny+tot2,node[i].y)-ny;
41         m[newx][newy]=1;
42     }
43 }

 

转载于:https://www.cnblogs.com/llllrj/p/9521324.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: MATLAB是一种功能强大的编程工具,它提供了丰富的函数和工具包,可以方便地进行二维离散傅里叶变换(2D DFT)的计算。下面是一个使用MATLAB编写二维离散傅里叶变换的示例代码: ```matlab % 设置输入信号 I = imread('image.jpg'); % 读取图像文件 I = double(rgb2gray(I)); % 将图像转换为灰度图并转换为双精度型 [N, M] = size(I); % 获取图像尺寸 % 计算二维离散傅里叶变换 X = zeros(N, M); % 初始化频域信号矩阵 for u = 1:N for v = 1:M for x = 1:N for y = 1:M X(u,v) = X(u,v) + I(x,y) * exp(-1j * 2 * pi * ((u-1) * (x-1)/N + (v-1) * (y-1)/M)); % 计算离散傅里叶变换公式 end end end end % 显示结果 subplot(1, 2, 1); imshow(uint8(I)); % 显示原始图像 title('原始图像'); subplot(1, 2, 2); imshow(log(1 + abs(X)), []); % 显示频域信号的幅度谱 title('频域信号'); ``` 在以上代码中,首先读取了图像文件,并将其转换为灰度图像。然后,根据离散傅里叶变换的公式,逐个计算频域信号矩阵中每个元素的值。最后,使用```subplot```函数将原始图像和频域信号的幅度谱显示在同一个窗口中。 这是一个简单的示例代码,可以帮助你了解如何使用MATLAB进行二维离散傅里叶变换的计算。在实际应用中,MATLAB还提供了更多用于优化和加速计算的函数和工具,可以更高效地进行二维离散傅里叶变换的计算。 ### 回答2: 要使用MATLAB编写二维离散傅里叶变换(DFT),可以按照以下步骤进行: 1. 创建一个二维矩阵,表示输入信号的图像。假设这个矩阵为A。 2. 使用双层循环遍历A的每个元素,计算其二维DFT。根据DFT的定义,可以使用以下公式计算: ![DFT 公式](https://wikimedia.org/api/rest_v1/media/math/render/svg/7eab1e140c9247270cc428a1a54c62da54304c2f) 其中,k 和 l 分别表示频域中的坐标,n 和 m 分别表示空间域(图像)中的坐标。A的大小为N x M,则 k 和 l 变化范围为 0 到 N-1,n 和 m 的变化范围为 0 到 M-1。 3. 如果您不想自己编写DFT的代码,可以使用MATLAB内置的fft2函数来计算二维DFT。该函数接受一个二维矩阵作为输入,并返回相应的DFT结果。 4. 显示或处理DFT结果。您可以使用MATLAB的imshow函数来显示变换后的频域图像,也可以进行其他信号处理任务,例如滤波、频域增强等。 需要注意的是,DFT计算量较大,特别是对于大尺寸的图像。为了提高能,可以考虑使用快速傅里叶变换(FFT)算法来替代直接计算。MATLAB中的fft2函数就是基于FFT算法实现的。 以上就是使用MATLAB自己编写二维离散傅里叶变换的基本步骤。希望对您有所帮助! ### 回答3: 在MATLAB中,可以使用自己编写的代码来实现二维离散傅里叶变换(2D DFT)。以下是一个简单的例子: ```matlab function output = my2DDFT(input) [N, M] = size(input); % 获取输入矩阵的大小 output = zeros(N, M); % 创建一个全零输出矩阵 for u = 1:N for v = 1:M sum = 0; % 计算DFT的和 for x = 1:N for y = 1:M sum = sum + input(x, y) * exp(-1i*2*pi*((u-1)*(x-1)/N + (v-1)*(y-1)/M)); end end output(u, v) = sum; end end end ``` 这是一个基本的二维离散傅里叶变换的实现。它使用了两个嵌套的循环来遍历输入矩阵中的每个元素,并计算DFT的和。在内部循环中,我们使用定义的离散傅里叶变换的公式来计算每个元素的贡献,并将其添加到总和中。最终的结果存储在输出矩阵中。 你可以调用`my2DDFT`函数,并传入你想要进行DFT的输入矩阵。它将返回一个计算完成的DFT矩阵。 需要注意的是,这只是一个简单的实现,可能会因为计算速度较慢而不适用于大规模的输入矩阵。在实际使用中,可以考虑使用MATLAB内置的`fft2`函数来获得更高效的二维离散傅里叶变换。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值