2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Matlab двумерные гистограммы
Сообщение30.05.2018, 02:18 
Всем доброго времени суток. Есть вопрос по гистограммам в matlab, может кто-нибудь сталкивался. Никак не могу разобраться как вычесть фон из двумерной гистограммы в matlab? И вообще есть ли такая возможность? То есть из каждой ячейки гистограммы необходимо вычесть одно и то же число. Гистограмму строил через "histogram()". Спасибо.

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 11:44 
Аватара пользователя
steven
Вам нужна гистограмма как объект:
Код:
h = histogram2(x,y)
Переменная h содержит много полей, к которым вы можете обратиться, смотрите справку. В вашей задаче вам нужен массив h.BinCounts. Изменение этого массива приводит к мгновенному изменению в графическом окне гистограммы.

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 19:48 
ShMaxG, действительно, при определении гистограммы таким образом там можно обратиться к массиву BinCounts. Но у меня не получается изменить массив BinCounts. Я попытался это сделать через рабочее окно командой "h.BinCounts - 100", но сама гистограмма графически при этом не изменилась.
И ещё такой вопрос. В некоторых ячейках гистограммы у меня значение 0. Не вызовет ли ошибку, что я вычту из 0 некоторое положительное натуральное число? Что произойдёт в этом случае? Гистограмма просто не будет построена?

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:01 
steven в сообщении #1316313 писал(а):
Я попытался это сделать через рабочее окно командой "h.BinCounts - 100"


Вы написали то что в кавычках в командной строке и считаете, что от этого должно измениться свойство объекта h????

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:25 
Аватара пользователя
steven
Ну если у вас есть переменная A и вы ее хотите изменить на единицу, вы же не пишете A-1, значение A так не изменится.
steven в сообщении #1316313 писал(а):
В некоторых ячейках гистограммы у меня значение 0. Не вызовет ли ошибку, что я вычту из 0 некоторое положительное натуральное число? Что произойдёт в этом случае? Гистограмма просто не будет построена?
Ну вы возьмите, да посмотрите. В любом случае, A(A>0) -- это все положительные элементы массива A. Этим и воспользуйтесь.

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:34 
Согласен, от этого не изменится, бред написал. В скрипте пытался это сделать командой:

h = histogram2(x, y);
h.BinCounts = h.BinCounts - 100;

На что matlab заругался и выдал ошибку:

Error using matlab.graphics.chart.primitive.Histogram2/set.BinCounts
Expected input to be nonnegative.

Error in Histogram (line 23)
h.BinCounts = h.BinCounts - 100;

То есть правильно ли я понимаю, что если у меня были нулевые ячейки и я вычел из них натуральное число, то гистограмму построить не получится? Или есть какой-то способ?

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:36 
Аватара пользователя
steven в сообщении #1316360 писал(а):
То есть правильно ли я понимаю, что если у меня были нулевые ячейки и я вычел из них натуральное число, то гистограмму построить не получится? Или есть какой-то способ?
Я вам уже дал указания, в какую сторону думать.
ShMaxG в сообщении #1316355 писал(а):
В любом случае, A(A>0) -- это все положительные элементы массива A. Этим и воспользуйтесь.

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 22:57 
Всем спасибо! Всё получилось. В общем, действительно в массиве h.BinCounts не может быть отрицательных чисел (ну это и логично :lol: ). Для вычитания "фона" пришлось сделать следующее: циклом прогнать весь массив с условием, что если данный элемент не больше "фона", то я его обнуляю, а в противном случае вычитаю "фон" из элемента.

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 23:16 
Аватара пользователя
steven в сообщении #1316375 писал(а):
Для вычитания "фона" пришлось сделать следующее: циклом прогнать весь массив с условием, что если данный элемент не больше "фона", то я его обнуляю, а в противном случае вычитаю "фон" из элемента.
Кстати это типичный подход людей, думающих "поэлементно", как на языке С. Не забывайте, слово Matlab образовано от слов Matrix Laboratory, эту систему создавали для удобства работы с матрицами, а не чтобы циклы гонять. Когда программируете на Matlab, стремитесь к избавлению от любых циклов. Например, пользуйтесь функцией max(A,B), которая действует на матрицы поэлементно. Вот эта строка делает то, что надо:
Код:
A = max(0,A-100)
Выражение A-100 даст матрицу, где могут быть отрицательные элементы. Обнуляются они с помощью функции максимума. Если надо было, например, единичку вычесть, то можно вот так писать:
Код:
A(A>0) = A(A>0) - 1
Она вычтется только из положительных элементов, так что нигде не будет отрицательных чисел (мне сначала почему-то показалось, что надо было единичку вычесть, поэтому подсказывал путь с A(A>0); ну, на заметку все равно возьмите).

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение31.05.2018, 02:37 
ShMaxG в сообщении #1316383 писал(а):
Кстати это типичный подход людей, думающих "поэлементно", как на языке С.


Шас «сишники» прибегут :D . На самом деле в С есть куча итераторов, позволяющих работать с векторами без циклов, а с помощью глубоко сюоптимизированных машинных кодов

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение31.05.2018, 09:34 
ozheredov в сообщении #1316396 писал(а):
На самом деле в С есть куча итераторов
Именно в C? Не в C++ или C#?

 
 
 
 Re: Matlab двумерные гистограммы
Сообщение31.05.2018, 11:35 
Pphantom

Э... по идее конечно всё это сильно пахнет объектной ориентированностью. Наверное да, в крестах и си-шарпе. Сорян, я не программист, так что точно не знаю

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group