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