0

我有一个包含两个数组的大型数据集,比如xy。这些数组的大小超过 100 万个数据点。有没有一种简单的方法来绘制这些点中只有 2000 个的散点图,但它可以代表整个集合吗?

我正在考虑创建另一个数组 r ;r = max(x)*rand(2000,1)获取 x 数组的随机样本。有没有办法找到 in 的值r等于或接近 in 的值x?它们不必位于相同的索引位置,而是位于整个矩阵中。然后我们可以绘制y与这些找到的值相关的xr

我只是不确定如何编码。有没有比这样做更好的方法?

4

2 回答 2

0

也许最简单的方法是使用round函数并将事物转换为整数,然后可以进行比较。例如,如果要查找 的值在 0.1 范围内的点,请先r将值乘以 10,然后四舍五入:

r = max(x) * round(2000,1);
rr = round(r / 0.1);
xx = round(x / 0.1);
inRR = ismember(xx, rr)
plot(x(inRR), y(inRR));

通过除以 0.1,任何具有相同整数值的值都在 0.1 范围内。

ismember如果该值在 中,1则为每个值返回 a ,否则为 a 。这些可用于选择要绘制的条目。xxrr0

于 2013-10-31T13:16:38.713 回答
0

我不确定这个过程对你的数据有多大的代表性,因为它取决于你的数据是什么样的,但你当然可以编写类似的代码。找到最接近的值的最简单方法是获取测试向量和所需值之间minabs差异。

r = max(x)*rand(2000,1);
for i = 1:length(r)
    [~,z(i)] = min(abs(x-r(i)));
end
plot(x(z),y(z),'.')

请注意,行[~,z(i)]中的min表示我们要将最小值的索引存储在 vector 中z

您也可以尝试移动平均线之类的方法,请参阅此视频:http: //blogs.mathworks.com/videos/2012/04/17/using-convolution-to-smooth-data-with-a-moving-average-在matlab/

或者你可以绘制每个n点,比如(我没有测试过,所以不能保证):

n = 1000;
plot(x(1:n:end),y(1:n:end))

或者,如果您知道想要的点数(同样,未经测试):

npoints = 2000;
interval = round(length(x)/npoints);
plot(x(1:interval:end),y(1:interval:end))
于 2013-10-31T12:56:40.650 回答