制作矩阵的每一列但没有零元素的直方图

Make histogram of every column of a matrix but without zero elements

我是运行一个盒子里的粒子模拟。当粒子离开盒子时,其动能变为零(时间 > t 逃逸)。所以我想制作一个直方图来说明 Wkinet(它是 nP=粒子数,ntM=时间步长的函数)如何随时间演变,但我不想考虑每一列的零值。有没有办法对其进行编码,以便它可以找到最佳的 bin 数量?

这是我试过的:

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

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

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...

...或者有时使用轴命令进行精确控制是有帮助的,例如

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

"pause"(用于交互使用)可能会被打印命令替换以将绘图保存到磁盘。例如

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 离散化引起的。