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

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




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

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

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

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


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

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

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

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

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

 Re: Matlab двумерные гистограммы
Аватара пользователя
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 двумерные гистограммы
ShMaxG в сообщении #1316383 писал(а):
Кстати это типичный подход людей, думающих "поэлементно", как на языке С.


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

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

 Re: Matlab двумерные гистограммы
Pphantom

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

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


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