使用MATLAB,我有一个带x坐标(第1列)和沙丘高度(第2列)的数据集(dune_h_data.txt)。对于相同的x坐标(子集),有几个沙丘高度。我想替换沙丘高度列或使用该子集的每个x坐标的每个沙丘高度子集的最大值来添加第三列。 我用MATLAB创建了一个脚本。我找到了x坐标唯一的每个子集的最大沙丘高度。我使用了以下命令。
[lines, ~, subs] = unique(x_co1);
Max_h = accumarray(subs, h, [], @max);
我无法将这些最大沙丘高度值分配给每个子集对应的每个坐标。请看我的剧本。预期结果显示在样本数据集“Max_dune_h(预期输出).txt”中。
dune_h_data.txt
x_co1
-21292.90039
-21292.90039
-21292.90039
-21292.90039
-21242.90039
-21242.90039
-21242.90039
-21242.90039
-21242.90039
-21192.90039
-21192.90039
-21192.90039
-21192.90039
-21192.90039
-21142.90039
-21142.90039
-21142.90039
-21142.90039
-21092.90039
-21092.90039
dune_heights的相应列
7.17153931
-7.93923998
-8.47749615
-8.5275507
8.57088375
-7.11603069
-7.87911987
-8.24691391
-8.5357933
8.86667347
0.86596704
-7.5994606
-8.20367718
-8.51330662
4.77929735
0.34045759
-8.10092926
-8.2374649
4.20417213
-7.31984854
与x坐标对应的预期最大沙丘高度列
7.17153931
7.17153931
7.17153931
7.17153931
8.57088375
8.57088375
8.57088375
8.57088375
8.57088375
8.86667347
8.86667347
8.86667347
8.86667347
8.86667347
4.77929735
4.77929735
4.77929735
4.77929735
4.20417213
4.20417213
我尝试写出最终的沙丘高度和x坐标的平均值。然后尝试使用if条件进行循环。但我得到的预期结果只有0个值。由于我对MATLAB SCRIPTING不太熟悉,我认为应该有一个简单的方法。
我可以附加样本数据集,但我不知道如何在这里做。
%%% average of dune height for each x coordinates
load dune_h_data.txt
x_co1=dune_h_data(:,1);
h=dune_h_data(:,2);
x_co1_int=round(x_co1);
fileID18 = fopen('x_co1_int.txt','w');
fprintf(fileID18,'%6.0f\r\n',x_co1_int);
fclose(fileID18);
[lines, ~, subs] = unique(x_co1);
Max_h = accumarray(subs, h, [], @max);
x_co_avg = accumarray(subs, x_co1, [], @mean);
fileID15 = fopen('Max_h.txt','w');
fprintf(fileID15,'%6.5f\r\n',Max_h);
fclose(fileID15);
fileID16 = fopen('x_co_avg.txt','w');
fprintf(fileID16,'%6.0f\r\n',x_co_avg);
fclose(fileID16);
x_co_avg_Max_h=[x_co_avg Max_h];
dune_h=zeros(size(x_co1));
m1=1:length(Max_h);
j1=1:length(x_co_avg);
for k1=1:length(x_co1_int)
x_co1v=x_co1_int(k1);
for j1=1:length(x_co_avg)
x_co_avg_u=x_co_avg(j1);
if x_co1v(k1) == x_co_avg_u(j1)
m1=j1;
dune_h(k1)=Max_h(m1);
end
end
fileID17 = fopen('dune_h.txt','w');
fprintf(fileID17,'%6.7f\r\n',dune_h);
fclose(fileID17);
end
答案 0 :(得分:0)
你的第一次尝试是在正确的轨道上。使用您的数据,
[lines, ~, subs] = unique(x_co1);
Max_h = accumarray(subs, h, [], @max);
为您提供Max_h
:
Max_h =
7.1715
8.5709
8.8667
4.7793
4.2042
现在剩下的就是创建一个新的向量,为subs
中的每个下标提供相应的最大高度:
Max_subs_h = Max_h(subs);
Max_subs_h =
7.1715
7.1715
7.1715
7.1715
8.5709
8.5709
8.5709
8.5709
8.5709
8.8667
8.8667
8.8667
8.8667
8.8667
4.7793
4.7793
4.7793
4.7793
4.2042
4.2042