我在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轴上我有X1
和X2
的任意两个元素之间的总和,而在y轴上我有总和Y1
和Y2
中任何可能的两个元素之间。
我在这里发布了我考虑过的三个选项,这些选项主要由于内存和速度问题而无法使用。
选项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
时,散点不会“收敛”到真实的图上;什么是“最佳” T
和R
?)。
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
有没有一种方法可以做我想做的事或根本就做不到?
答案 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