在Matlab中进行散点图时的内存速度问题

时间:2018-11-08 15:28:47

标签: matlab plot scatter-plot

我在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

有没有一种方法可以做我想做的事或根本就做不到?

1 个答案:

答案 0 :(得分:2)

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

对于较小的向量(即P <1e4),请尝试:

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