Сделать гистограмму каждого столбца матрицы, но без нулевых элементов

Я запускаю симуляцию частиц в коробке. Когда частица покидает ящик, ее кинетическая энергия становится равной нулю (за время > t выхода). Итак, я хочу построить гистограмму того, как Wkinet (которая является функцией nP = количество частиц, ntM = временных шагов) развивается во времени, но я не хочу принимать во внимание нулевые значения каждого столбца. Есть ли способ закодировать его, чтобы он мог найти оптимальное количество бункеров?

Это то, что я пробовал:

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

Сделать гистограмму каждого столбца матрицы, но без нулевых элементов

Почему бы не сделать гистограмму с нулями, а затем просто удалить эту ячейку?

Mad Physicist 12.05.2019 21:44

Как я мог это сделать? Также одна проблема заключается в том, что он показывает мне только последнюю гистограмму для финала j, как я могу решить эту проблему и заставить ее отображать все гистограммы на одном графике? заранее спасибо

nikos 12.05.2019 21:49

Старайтесь не перезаписывать y каждую итерацию цикла.

Cris Luengo 12.05.2019 21:50

Можете ли вы объяснить, как я могу это сделать, пожалуйста?

nikos 12.05.2019 22:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
175
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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...

... или иногда полезно использовать команду оси для точного управления, например.

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, вероятно, вызванная дискретизацией бина.

спасибо! Не могли бы вы также помочь мне сделать график похожим на этот ... я имею в виду только показать подгонку, а не столбцы, быть нормированным по оси Y и иметь те же ограничения по оси X я добавил изображение в изначальный вопрос? @ЭрикП

nikos 13.05.2019 11:54

Обновления о том, как вы удаляете графики, как изменить масштаб на логарифмическую ось и как ограничить масштабы. Неясно, какую нормализацию вы ищете на графике PDF. Потенциально вы можете проверить YData H(2) для дальнейших манипуляций.

ErikP 13.05.2019 13:46

Добавлено примечание о функции fitdist, которая, вероятно, более точно соответствует тому, что вы делаете.

ErikP 13.05.2019 14:04

Большое спасибо! Хотя второй не работает (у него несбалансированное предложение, и вы хотели сказать pdf в myY? .. Что я имел в виду по оси Y, так это то, что я хочу показать процент и переход от нуля к 1. @ЭрикП

nikos 13.05.2019 22:28

@nikos, да, я имел в виду pdf, отредактированный. Хотя не видел, где импаланс. Я не уверен, какой процент вам нужен. Если это% максимальной плотности, вы можете просто масштабировать, разделив на max(myY).

ErikP 13.05.2019 23:06

Другие вопросы по теме