2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Matlab двумерные гистограммы
Сообщение30.05.2018, 02:18 


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 11:44 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 19:48 


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:01 


10/03/16
4444
Aeroport
steven в сообщении #1316313 писал(а):
Я попытался это сделать через рабочее окно командой "h.BinCounts - 100"


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:25 
Заслуженный участник
Аватара пользователя


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 21:34 


01/02/18
7
Согласен, от этого не изменится, бред написал. В скрипте пытался это сделать командой:

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 
Заслуженный участник
Аватара пользователя


11/04/08
2749
Физтех
steven в сообщении #1316360 писал(а):
То есть правильно ли я понимаю, что если у меня были нулевые ячейки и я вычел из них натуральное число, то гистограмму построить не получится? Или есть какой-то способ?
Я вам уже дал указания, в какую сторону думать.
ShMaxG в сообщении #1316355 писал(а):
В любом случае, A(A>0) -- это все положительные элементы массива A. Этим и воспользуйтесь.

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 22:57 


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение30.05.2018, 23:16 
Заслуженный участник
Аватара пользователя


11/04/08
2749
Физтех
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 


10/03/16
4444
Aeroport
ShMaxG в сообщении #1316383 писал(а):
Кстати это типичный подход людей, думающих "поэлементно", как на языке С.


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

 Профиль  
                  
 
 Re: Matlab двумерные гистограммы
Сообщение31.05.2018, 09:34 
Заслуженный участник


09/05/12
25179
ozheredov в сообщении #1316396 писал(а):
На самом деле в С есть куча итераторов
Именно в C? Не в C++ или C#?

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


10/03/16
4444
Aeroport
Pphantom

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

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group