我对MatLab很新,这个问题确实让我感到疯狂:
我有一个巨大的2列和大约31,000行。两列中的一列描绘了网格上的空间坐标,另一列描绘了从属参数。我想做的是以下几点:
予。我需要将数组拆分成由空间列定义的较小部分;假设空间坐标的范围是0到500 - 我现在想要的数组给出空间坐标0-10的两个列值,然后是10-20,依此类推。这将导致50个不等大小的阵列覆盖0到500的空间范围。
II。其次,我需要计算每个数组的结果列的平均值,以便我获得每个数组一个二维点。
III。第三,我可以绘制这些点,我会非常高兴。
可悲的是,我非常困惑,因为我在第一步失败了。 - 也许甚至比在这么多小阵列中分割巨型阵列更简单 - 谁知道......我真的很高兴任何建议。
谢谢,
·阿尔
答案 0 :(得分:0)
首先,由于您希望数组的数据结构大小不同,因此您需要将它们放在单元格数组中,这样您就可以尝试这样的事情:
res = arrayfun(@(x)arr(arr(:,1)==x,:), unique(arr(:,1)), 'UniformOutput', 0);
前面的代码返回一个单元格数组,其数组按照第一列分割,@(x)arr(arr(:,1)==x,:)
您正在 x 上执行函数,而arrayfun(function, ..., 'UniformOutput', 0)
将函数应用于每个元素以下参数(采用每个参数的单个值来评估函数)但是您必须注意到arr必须是数字,否则您应该将值映射到数值或使用其他方法来选择此值。
以同样的方式做到
uo = 'UniformOutput';
res = arrayfun(@(x){arr(arr(:,1)==x,:), mean(arr(arr(:,1)==x,2))), unique(arr(:,1)), uo, 0);
您可能希望平滑返回值,检查函数cat
,您可以这样做:
res = cat(1,res{:})
绘制你的数据取决于它们的格式,所以如果我不知道数据是什么,我就无法帮助你,但是你可以尝试在你的'res'变量或类似内容的循环内绘图。
答案 1 :(得分:0)
步骤我确实遇到了一些困难。一旦解决了这些问题,我猜第二步和第三步很容易解决。让我为第一步提出一些建议:
首先定义最大值(maxValue = 500;
)和步长(stepSize = 10;
)。现在可以遍历所有步骤并创建新的向量。
for k=1:maxValue/stepSize
...
end
由于每个结果数组都有不同的维度,我建议您将向量保存在cell array中:
Y = cell(maxValue/stepSize,1);
使用find函数查找每个矩阵的条目行。在每个步骤k
,感兴趣的值范围为(k-1)*stepSize
到k*stepSize
。
row = find( (k-1)*stepSize <= X(:,1) & X(:,1) < k*stepSize );
您现在可以通过
为步骤k
创建矩阵
Y{k,1} = X(row,:);
将所有内容放在一起您应该能够创建包含矩阵的单元格数组Y
并继续执行其他任务。您还可以在单元格数组Y
的第二列中保存每个值范围的平均值:
Y{k,2} = mean( Y{k,1}(:,2) );
我希望这可以帮助您完成任务。请注意,这些只是建议,可能有不同的(可能更合适的)方法来处理这个问题。