【问题标题】:Memory-speed issues when doing a scatter plot in Matlab在 Matlab 中做散点图时的内存速度问题
【发布时间】:2018-11-08 15:28:47
【问题描述】:

我在 Matlab 中有以下内存速度问题,希望您能帮助我了解是否有解决方案。

考虑以下4 大列向量X1, X2, Y1, Y2

clear 
rng default
P=10^8;
X1=rand(1,P)*5;
X2=rand(1,P)*5;
Y1=rand(1,P)*5;
Y2=rand(1,P)*5;

我想要做的是一个散点图,其中在 x 轴上我有 X1X2 的任何可能的两个元素之间的总和,在 y 轴上我有任何可能的两个元素之间的总和Y1Y2 的元素。

我在这里发布了三个我认为不起作用的选项,主要是因为内存和速度问题。

选项 1(问题:执行循环时太慢,执行 vertcat 时内存不足)

Xtemp=cell(P,1);
Ytemp=cell(P,1);
for i=1:P
    tic
    Xtemp{i}=X1(i)+X2(:);
    Ytemp{i}=Y1(i)+Y2(:);
    toc
end
X=vertcat(Xtemp{:}); 
Y=vertcat(Ytemp{:});
scatter(X,Y)

选项 2(问题:循环太慢,循环进行时时间增加,Matlab 发疯,即使我在 5 次迭代后停止循环也无法产生分散)

for i=1:P
    tic
    scatter(X1(i)+X2(:), Y1(i)+Y2(:))
    hold on 
    toc
end

选项 3(有点放弃)(问题:当我增加 T 时,散点越来越接近正确的正方形;我想知道这是否是由事实上,我使用 rand 生成数据,在选项 3 中我使用 randi;也许随着我增加 T,散点图不会“收敛”到真实图;此外,什么是“最佳" TR?)。

T=20;
R=500;
for t=1:T
    tic
    %select R points at random from X1,X2,Y1,Y2 
    X1sel=(X1(randi(R,R,1)));
    X2sel=(X2(randi(R,R,1)));
    Y1sel=(Y1(randi(R,R,1)));
    Y2sel=(Y2(randi(R,R,1)));
    %do option 1 among those points and plot
    Xtempsel=cell(R,1);
    Ytempsel=cell(R,1);
    for r=1:R
        Xtempsel{r}=X1sel(r)+X2sel(:);
        Ytempsel{r}=Y1sel(r)+Y2sel(:);
    end
    Xsel=vertcat(Xtempsel{:}); 
    Ysel=vertcat(Ytempsel{:});
    scatter(Xsel,Ysel, 'b', 'filled')
    hold on
    toc
end

有没有办法做我想做或根本不可能做的事?

【问题讨论】:

  • 你的数据矩阵有多少行?
  • 谢谢:P=10^8 我在问题中写道
  • 假设您有一台 4k(超高清)显示器,分辨率高达 4096 x 2160,总计约 8*10^6 像素。 您将无法在绘图上看到 10^8 个不同的点,更不用说它们的所有总和组合了! 重新思考问题,重新定义您想要实现的目标这个情节,并且可能有更好的方法来做到这一点!
  • @Wolfie 谢谢。我的目标不是看到每个点,而是看到从它们中出来的图片的形状。
  • @user 这就是我的意思,您可以分析“形状”而没有不可能的情节,使用诸如最佳拟合、传播度量、最大/最小/平均值、趋势、包络、直方图、众多其他指标和可视化...从尝试绘图退后一步,找出您想要显示的内容,您感兴趣的内容,以及如何在没有绘图的情况下展示您的点密度将为 (10^16/10^6)=10^10 个点/像素...

标签: matlab plot scatter-plot


【解决方案1】:

您正在尝试使用 P^2 个元素构建一个向量,即 10^16。这比标准计算机的内存(10GB 是 10^10 字节或 12 亿双精度浮点数)要高出许多数量级。

对于较小的向量(即 P

Xsum=bsxfun(@plus,X1,X2.'); %Matrix with the sum of any two elements from X1 and X2
X=X(:);                     %Reshape to vector
Ysum=bsxfun(@plus,Y1,Y2.');
Y=Y(:);
plot(X,Y,'.') %Plot as small dots, likely to take forever if there are too many points

要构建一个从这些大向量中随机挑选的具有更合理数量对的图形:

Npick=1e4;
sel1=randi(P,[Npick,1]);
sel2=randi(P,[Npick,1]);
Xsel=X1(sel1)+X2(sel2);
Ysel=Y1(sel1)+Y2(sel2);
plot(Xsel,Ysel,'.');     %Plot as small dots

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 2013-02-12
    • 2013-12-17
    • 1970-01-01
    • 2020-10-04
    • 2013-08-17
    • 1970-01-01
    相关资源
    最近更新 更多