使用MATLAB,将每个子数据集的最大值分配给原始数据集(如果每个子数据集,则用最大值替换数据列)

时间:2018-04-01 20:18:16

标签: matlab

使用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

1 个答案:

答案 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