matlab中y=x(:,ones(1,3))的含义解读

clear all
close all
clc
x=rand(5,5);
y=x(:,ones(1,3))

下面为运行结果
x=
0.0971 0.0344 0.1869 0.7547 0.1190
0.8235 0.4387 0.4898 0.2760 0.4984
0.6948 0.3816 0.4456 0.6797 0.9597
0.3171 0.7655 0.6463 0.6551 0.3404
0.9502 0.7952 0.7094 0.1626 0.5853
y =
0.0971 0.0971 0.0971
0.8235 0.8235 0.8235
0.6948 0.6948 0.6948
0.3171 0.3171 0.3171
0.9502 0.9502 0.9502
x(:,ones(1,3))=x(:,[1 1 1])实际就是取出x中的第一列、第一列、第一列;
个人理解:
众所周知取出x中的第m列为x(:,m);
类推:取出x中的第m、n列为x(:,[m n]);
故取出x中第1列、第1列、第1列为x(:,[1,1,1]),所以为x(:,ones(1,3)).

我的横坐标是从第三列开始,第二行;纵坐标是从第三行开始,第2列;深度数据第3行,第3列开始,修改下面的代码% 问题四的MATLAB代码实现(最终修正版) clear; clc; % 1. 读取附件数据 try data = xlsread(&#39;附件.xlsx&#39;); % 假设附件名为附件.xlsx x_nm = data(:,1); % 东西方向坐标(海里) y_nm = data(:,2); % 南北方向坐标(海里) depth = data(:,3); % 海水深度(米) catch error(&#39;无法读取附件.xlsx文件,请检查文件是否存在或格式是否正确&#39;); end % 转换为米制单位 x = x_nm * 1852; y = y_nm * 1852; % 2. 数据清洗 - 移除NaN或Inf值 valid_idx = isfinite(x) & isfinite(y) & isfinite(depth); x = x(valid_idx); y = y(valid_idx); depth = depth(valid_idx); if isempty(x) error(&#39;所有数据点都包含NaN或Inf值,无法继续计算&#39;); end % 3. 绘制海底地形图 figure; scatter3(x, y, depth, 10, depth, &#39;filled&#39;); colorbar; xlabel(&#39;东西方向 (m)&#39;); ylabel(&#39;南北方向 (m)&#39;); zlabel(&#39;深度 (m)&#39;); title(&#39;海底地形立体图&#39;); % 检查是否有足够的数据点进行三角剖分 if length(x) < 3 warning(&#39;数据点不足,无法生成曲面图&#39;); else figure; tri = delaunay(x, y); trisurf(tri, x, y, depth); shading interp; colorbar; xlabel(&#39;东西方向 (m)&#39;); ylabel(&#39;南北方向 (m)&#39;); zlabel(&#39;深度 (m)&#39;); title(&#39;海底地形曲面图&#39;); end % 4. 区域划分(这里简化处理,实际应根据地形特征自动划分) % 假设将海域划分为4个区域 x_min = min(x); x_max = max(x); y_min = min(y); y_max = max(y); x_mid = (x_min + x_max)/2; y_mid = (y_min + y_max)/2; region = zeros(size(x)); region(x <= x_mid & y <= y_mid) = 1; % 区域1:西南 region(x > x_mid & y <= y_mid) = 2; % 区域2:东南 region(x <= x_mid & y > y_mid) = 3; % 区域3:西北 region(x > x_mid & y > y_mid) = 4; % 区域4:东北 % 5. 对每个区域进行坡面拟合 alpha = zeros(4,1); % 坡度 beta = zeros(4,1); % 法向投影角度 D0 = zeros(4,1); % 区域中心深度 for r = 1:4 idx = (region == r); x_r = x(idx); y_r = y(idx); z_r = depth(idx); % 检查区域是否有足够的数据点 if sum(idx) < 3 warning(&#39;区域%d数据点不足,使用默认值&#39;, r); alpha(r) = deg2rad(1.5); % 默认坡度1.5度 beta(r) = 0; % 默认法向角度0度 D0(r) = mean(depth); % 使用整体平均深度 continue; end % 最小二乘拟合平面 z = A + Bx + Cy A = [ones(length(x_r),1), x_r, y_r]; coeff = A \ z_r; % 计算坡度和法向投影角度 B = coeff(2); C = coeff(3); alpha(r) = atan(sqrt(B^2 + C^2)); % 坡度 beta(r) = atan2(-C, -B); % 法向投影角度 % 区域中心深度 x_center = mean(x_r); y_center = mean(y_r); D0(r) = coeff(1) + coeff(2)*x_center + coeff(3)*y_center; end % 6. 设计测线 theta = 120; % 开角 theta_rad = deg2rad(theta); % 存储结果 total_length = 0; overlap_20 = 0; missed_area = 0; % 对每个区域设计测线 for r = 1:4 idx = (region == r); x_r = x(idx); y_r = y(idx); z_r = depth(idx); % 检查区域是否有数据 if isempty(x_r) warning(&#39;区域%d没有数据点,跳过测线设计&#39;, r); continue; end % 区域边界(确保是标量) x_min_r = min(x_r); x_max_r = max(x_r); y_min_r = min(y_r); y_max_r = max(y_r); % 确保边界值是标量 if isempty(x_min_r) || isempty(x_max_r) || isempty(y_min_r) || isempty(y_max_r) warning(&#39;区域%d边界值计算失败,跳过&#39;, r); continue; end % 测线方向平行于等深线 line_angle = beta(r) + pi/2; % 设计测线间距 D_avg = mean(z_r); W_avg = 2 * D_avg * tan(theta_rad/2); d = max(1, 0.9 * W_avg); % 保持10%重叠,最小间距1米 % 生成测线 if abs(cos(line_angle)) > abs(sin(line_angle)) % 主要沿x方向 n_lines = max(2, ceil((x_max_r - x_min_r)/d)); % 至少2条测线 line_pos = linspace(x_min_r, x_max_r, n_lines); line_length = y_max_r - y_min_r; else % 主要沿y方向 n_lines = max(2, ceil((y_max_r - y_min_r)/d)); % 至少2条测线 line_pos = linspace(y_min_r, y_max_r, n_lines); line_length = x_max_r - x_min_r; end % 计算总长度 total_length = total_length + n_lines * line_length; % 简化计算重叠率超过20%的部分 overlap_20 = overlap_20 + 0.1 * n_lines * line_length; % 计算漏测区域 area_total = (x_max_r - x_min_r) * (y_max_r - y_min_r); area_covered = n_lines * W_avg * line_length; missed_area = missed_area + max(0, area_total - area_covered); end % 计算漏测百分比 total_area = (x_max - x_min) * (y_max - y_min); if total_area == 0 missed_percent = 0; else missed_percent = missed_area / total_area * 100; end % 7. 输出结果 fprintf(&#39;\n========== 最终结果 ==========\n&#39;); fprintf(&#39;测线总长度: %.2f 米\n&#39;, total_length); fprintf(&#39;漏测海域占总面积的百分比: %.2f%%\n&#39;, missed_percent); fprintf(&#39;重叠率超过20%%部分的总长度: %.2f 米\n\n&#39;, overlap_20); % 8. 绘制测线设计图 figure; scatter(x, y, 10, depth, &#39;filled&#39;); hold on; colorbar; % 绘制各区域测线 for r = 1:4 idx = (region == r); x_r = x(idx); y_r = y(idx); if isempty(x_r) continue; end % 区域边界(确保是标量) x_min_r = min(x_r); x_max_r = max(x_r); y_min_r = min(y_r); y_max_r = max(y_r); if isempty(x_min_r) || isempty(x_max_r) || isempty(y_min_r) || isempty(y_max_r) continue; end line_angle = beta(r) + pi/2; if abs(cos(line_angle)) > abs(sin(line_angle)) % 主要沿x方向 n_lines = min(10, ceil((x_max_r - x_min_r)/100)); % 简化显示,最多10条 if n_lines < 2 n_lines = 2; end line_pos = linspace(x_min_r, x_max_r, n_lines); for i = 1:length(line_pos) plot([line_pos(i), line_pos(i)], [y_min_r, y_max_r], &#39;r-&#39;); end else % 主要沿y方向 n_lines = min(10, ceil((y_max_r - y_min_r)/100)); % 简化显示,最多10条 if n_lines < 2 n_lines = 2; end line_pos = linspace(y_min_r, y_max_r, n_lines); for i = 1:length(line_pos) plot([x_min_r, x_max_r], [line_pos(i), line_pos(i)], &#39;r-&#39;); end end end xlabel(&#39;东西方向 (m)&#39;); ylabel(&#39;南北方向 (m)&#39;); title(&#39;测线设计示意图&#39;); hold off;,输出完整代码
最新发布
07-21
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值