制作矩阵的每一列但不包含零元素的直方图

时间:2019-05-12 19:42:12

标签: matlab histogram matlab-figure

我正在模拟盒子中的粒子。当粒子离开盒子时,其动能变为零(时间> t逸出)。因此,我想对Wkinet(它是nP =粒子数,ntM =时间步长的函数)如何随时间演变的直方图,但我不想考虑每列的零值。有没有一种方法可以对其进行编码,以便找到最佳数量的垃圾箱?

这是我尝试过的:

nbins = 1000;
for j = 1:ntM/5
    Wkinet(Wkinet==0) = NaN;
    y = Wkinet(:,j).*erg2eV;
end
histfit(y,nbins)

here

1 个答案:

答案 0 :(得分:1)

一旦掌握了语法,逻辑索引通常会相当快速和直观。

myTolerance=1e-7; % in erg units.
nbins=1000;
for j=1:ntM/5
    %Wkinet(Wkinet==0)=NaN;
    % y=Wkinet(:,j).*erg2eV; % An extra assigment is costly and probably not needed.
    H = histfit(Wkinet(abs(Wkinet(:,j))>myTolerance, j) * erg2ev, nbins);
    % Select from column j all rows in column j whose absolute values are greater than the tolerance. 
    % Assumption; erg2ev is just a scalar, otherwise select its entries with erg2ev(abs(Wkinet(:,j))>myTolerance)
    H(1).delete; Remove bins, only keep the fit.
    set(gca, 'YScale', 'log'); % Make logarithmic Y
    set(gca, 'XScale', 'log'); % Make logarithmic X
    pause
end

如果需要显式限制轴,请使用

xlim([lowerBound upperBound]); ylim(etc...

...或者有时候使用axis命令进行精确控制会有所帮助,例如

ax=axis; ax(3)=min( 8ax(3) maxAllowedY]); axis(ax);

“暂停”(用于交互式使用)可以由打印命令代替,以将图保存到磁盘。例如

print(sprintf('My_plot_%02d',j),'-dpng');

或保存图形:

savefig(sprintf('My_fig_%02d',j));

如果确定打印数量少于16个,则可以在循环中放置一个subplot命令。将暂停替换为

subplot(4,4,j);

最后的笔记;如果您打算绘制适合非零数据的正态分布,则使用

替换histfit函数可能会获得更好的结果
myFit = fitdist(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev), 'Normal');
maxEv = max(Wkinet(Wkinet(:,j)>myTolerance, j) * erg2ev);
myX   = [myTolerance; maxEv/100; maxEv]; % Alter for different plot X-axis
myY   = pdf(myFit, myX);
plot(myX, myY);

我检查了一下,fitdist和histdist之间存在差异,可能是由于bin离散化造成的。