1. 前言
基于某小区某一楼栋各个户型及楼层之间对应的出售价格表,通过MATLAB脚本进行读取解析,并绘制成三维网格图,从而能够直观地以可视化的角度观察户型位置(东边户、西边户、中间连廊户)、楼层位置(高中低楼层)等因素是否与出售价格存在一定的影响关系。
2. 预置条件
序号 | 配置项 | 说明 |
---|---|---|
1 | 某楼栋出售价格表 | 存储了各楼层及各户型对应的房价数据文件,以xlsx或txt格式进行存储 |
2 | MATLAB | 2023b |
3. 步骤记录
- 将文件放置在当前文件夹下,与MATLAB代码文件保持同一层级,文件内容示例如下。
-
使用
readtable
函数读取xlsx文件,或用load
命令直接加载txt文件。此时priceData变量的数据类型是30*4的double
类型的二维矩阵。设定该楼栋为4户型30层。
% 读取xlsx文件,并转换成double类型的二维矩阵 priceData = table2array(readtable('priceData.xlsx')); % 读取txt文件,MATLAB将自动以文件名作为变量名称,存储文件中的数据 load priceData.txt;
-
根据priceData矩阵的维度,分别生成户型行向量和楼层行向量。
priceData矩阵存储的数据中,行数为楼层,列数为户型。
rooms = 1:size(data, 2); floors = 1:size(data, 1);
-
对户型和楼层生成二维网格矩阵,此时rooms和floors矩阵的维度均变成了30*4,且与priceData矩阵保持一致。
[room_1, floor_1] = meshgrid(rooms, floors);
-
通过
mesh
函数绘制并渲染三维网格图,效果如下。figure; mesh(rooms, floors, priceData); xlabel("户型"); ylabel("楼层"); zlabel("单价"); grid on;
4. 数据插值优化
通过观察以上生成的三维网格图,可基本看出楼层、户型与价格的影响关系。如:底顶楼层的价格相对较低;其他楼层中,每隔几层楼就出现一次价格较低的楼层;同一楼层中不同户型位置价格变化不大,整体上西边户(01户)的出售价格相较于其他户型来说是偏低的。
但是,由于楼层仅有30层,相邻楼层之间的连线较为生硬,希望通过平滑曲线来展示同一户型不同楼层的价格影响趋势,这就需要将楼层以及出售价格等数据进行精细化处理,处理步骤如下。
-
分别对户型行向量和楼层行向量进行精细化处理,此时户型和楼层行向量的长度可通过如下公式计算。
\[\mathit{ \left\{\begin{matrix} Len_{room\_itp} =\frac{size(rooms,2) - 1}{0.05} + 1 \\ Len_{floor\_itp} =\frac{size(floors,2) - 1}{0.05} + 1 \end{matrix}\right.} \]room_itp = 1:0.05:size(rooms,2); floor_itp = 1:0.05:size(floors, 2);
-
对户型和楼层重新生成二维网格矩阵,大小为\(Len_{floor\_itp}\times Len_{room\_itp}\)
[room_1, floor_1] = meshgrid(room_itp, floor_itp);
-
再利用MATLAB中的
interp2
函数,对出售价格进行插值计算。其中,插值方式采用cubic(三次插值)方法。
prices = interp2(rooms, floors, priceData, room_1, floor_1, 'cubic');
-
再次通过
mesh
函数绘制并渲染三维网格图,效果如下。
figure;
mesh(room_1, floor_1, prices);
xlabel("户型");
ylabel("楼层");
zlabel("单价");
grid on;
5. 完整代码
clc;clear;
file = './priceData.xlsx';
priceData = table2array(readtable(file));
rooms = 1:size(priceData, 2);
floors = 1:size(priceData, 1);
% 对户型、楼层做插值
room_itp = 1:0.05:size(rooms,2);
floor_itp = 1:0.05:size(floors, 2);
[room_1, floor_1] = meshgrid(room_itp, floor_itp);
prices = interp2(rooms, floors, priceData, room_1, floor_1, 'cubic');
figure;
mesh(room_1, floor_1, prices);
xlabel("户型");
ylabel("楼层");
zlabel("单价");
grid on;
标签:room,priceData,floor,某楼栋,户型,网格,楼层,MATLAB,itp
From: https://www.cnblogs.com/fantasyboyce/p/18673693