IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Программирование (http://www.imho.ws/forumdisplay.php?f=40)
-   -   помогите разобраться с прогой в MatLab (http://www.imho.ws/showthread.php?t=61284)

Комбинатор 09.06.2004 15:59

помогите разобраться с прогой в MatLab
 
я только начал его учить ;)
вот функция
Код:

function B=matrix_cheak(A)
n=1;
 
for i=1:9
      for  a=1:9
                    if(  v1(a)==A(i) )
                v2(a)=v2(a)+1;
        else
          v1(n)=A(i);
    v2(n)=1;
    n=n+1;
        end
      end
end
end

после компилирования появляется почемуто ошибка
Код:

Error in ==> C:\MATLAB6p5\work\matrix_cheak.m
On line 8  ==>                      if(  v1(a)==A(i) )

почему так?

Drakosha 09.06.2004 16:28

может быть потому что v1(a) не определен ?

Комбинатор 09.06.2004 16:38

Drakosha если я определяю его например v1=[1:9]; то проблемма таже :(

Drakosha 09.06.2004 19:19

точнее, значение в в1(а) не определено, а ты его читаешь


сорри, глупость сморозил.

crawler 09.06.2004 19:32

Drakosha дело говорит, и не только v1, no i A.

Код:

n=1;
v1=1:9;
A=1:9;
for i=1:9
    for  a=1:9
        if(  v1(a)==A(i) )
            v2(a)=v2(a)+1;
        else
            v1(n)=A(i);
            v2(n)=1;
            n=n+1;
        end
    end
end

и пользуйся смарт-индентом, а то код нечитаемый

П.С. А какая ошибка написано всего лишь одной строкой перед ошибкой :
Код:

??? Undefined function or variable 'A'.

Error in ==>


Комбинатор 09.06.2004 22:51

Цитата:

Drakosha:
точнее, значение в в1(а) не определено, а ты его читаешь
так у меня же там цикл т.е. а принимает значения от 1 до 9
или всё равно как до фора надо было обьявлять переменую?

Цитата:

crawler:
Drakosha дело говорит, и не только v1, no i A.

Код:
n=1;
v1=1:9;
A=1:9;
.........................
так это же функция и А это матрица, она её должна принять.
так если её обьявить в теле то значение матрицы уже будет другим
?

Цитата:

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

crawler 10.06.2004 11:32

Ысчо раз: ты пытаешься прочесть из массива переменную, которая не была определена.
Цитата:

А это матрица, она её должна принять
, да не заметил :)
Размер А должен быть как минимум 1х9. тоже и для v1. Они должны быть определены (забиты значениями) до того как ты к ним обращаешься.
Цитата:

X=1:4;
Y=X(5)
работать не будет,а
Цитата:

X=1:6;
Y=X(5)
будет

И не надо иметь переменные с похожими названиями (а и А) - это очень плохо сказывается на отладке.Переименуй а в ind_a, например.

Для дебуга зайди в редакторе в меню DEBUG, поставь галочку напротив "Stop if error". Тогда при ошибке прога будет останавливаться на месте где она случилась и ты сможешь посмотреть значения переменных и понять почему случилась ошибка.



смарт-индент: автоматический формат кода. выдели кусок кода (или сразу весь), правый клик -> смарт-индент и будет тебе красота и счастье.

Комбинатор 10.06.2004 12:34

crawler извени за мою тупость :)
но я не понял
Цитата:

crawler:
Размер А должен быть как минимум 1х9. тоже и для v1. Они должны быть определены (забиты значениями) до того как ты к ним обращаешься.
А если например матрица может быть любой, тоесть мне надо её принять, и она может быть например один раз 7*7 а другой раз 10*10, то как быть тогда. так как если я её определю в теле функции например как 7*7 то она не будет работать для матриц большей размерности чем 7*7.


Цитата:

crawler:
смарт-индент: автоматический формат кода. выдели кусок кода (или сразу весь), правый клик -> смарт-индент и будет тебе красота и счастье
что то не вижу не каки изменений :rolleyes:
или я что то не понял ;)

crawler 13.06.2004 19:35

inkognito
Извиняю :)
Просто НЕЛЬЗЯ обращатся к ячейке с несуществующим индексом.
Код:

допустим А - одноразмерный массив
v1(j) НЕ ОПРЕДЕЛЕН !!!!
 
function B=matrix_cheak(A)
n=1;
for i=1:length(A)
      for  j=1:length(v1)
                  % v1(j) НЕ ОПРЕДЕЛЕН !!!!
        if(  v1(j)==A(i) )  % а ты к нему обращаешься нисмотря на это ;)
        v2(j)=v2(j)+1;
        else
          v1(n)=A(i);
        v2(n)=1;
        n=n+1;
        end
      end
end
end

то есть v1 нужно определить до входа в цикл

снова, в твоей функции может случится так что некоторые ячейки v2 не будут определены ТОБОЙ. В таком случае Матлаб автоматически забьет неопределенные ячейки нулями, а размер v2 будет определен последней определенной ячейкой. Т.Е. если ты определишь
Код:

v2=[];
v2(14)=53;

то размер v2 будет 1х14, a первые 13 ячеек будут заполненены нулями.

Комбинатор 14.06.2004 00:54

crawler на счет v я понял;

а вот как быть с матрицей нет, вот допустим самая простая функция
Цитата:

function Z=abc(A)
A-1;
end
и он мне опять пишет что А не определён
Цитата:

??? Input argument 'A' is undefined.

Error in ==> C:\MATLAB6p5\work\abc.m
On line 2 ==> A-1;
тоесть неужели я не могу например как в С++ например, чтоб А я принимал из вне? а не определял её внутри?

Drakosha 14.06.2004 01:35

а как ты ето запускаешь?

vot (glupii) primer, _vajno_ polojit ego v file fun1.m
---------------------------------
function f = fun1(x)

%% This is the function f(x)

f(1) = x(1)^3 + x(1)*x(2)^3 - 9;
f(2) = 3*x(1)^2*x(2) - x(2)^3 - 4;
----------------------------------------

Комбинатор 14.06.2004 10:12

Drakosha я ложил в фаил
например

Цитата:

Drakosha:
а как ты ето запускаешь?
например открываю окно матлаба, там ввожу edit появляется окно
внем ввожу пример простой функции
Цитата:

function Z=abc(A)
A-1;
end
потом жму save as.. даю файлу имя abc.m
потом закрываю его сохраняю под этим именем, потом из самого матлаба
открываю фаил abc.m делаю в нём run
и внём выдаёт ошибку, часть черная часть красная
Цитата:

Warning: File: C:\MATLAB6p5\work\abc.m Line: 3 Column: 1
Unmatched "end".
(Type "warning off MATLAB:m_warning_end_without_block" to suppress this warning.)

??? Input argument 'A' is undefined.

Error in ==> C:\MATLAB6p5\work\abc.m
On line 2 ==> A-1;


Drakosha 14.06.2004 11:04

а зачем отрывать файл? Надо сделать так:

abc(4) <enter>

и получишь 3 ;)

crawler 14.06.2004 11:25

inkognito
ну ты даешь! А если бы ты в С такое написал, компайлер бы не заругался?

Во первых ты запускаешь ФУНКЦИЮ abc без входных аргументов. А потом удивляешься что А не определен. Разницу между скриптами и функциями знаешь ? Вот она! Теперь ты ее можешь почувствовать. Испаравляй как сказал Drakosha.

а во вторых как ты хочешь получать назад значения ?
Код:

function Z=abc(A)
Z=A-1;
end

Я тебе рекомендую посмотреть демки и их код, а также посмотри хелп на тему
Programming and Data Types: M-File Programming: Functions

Комбинатор 14.06.2004 11:56

Цитата:

Drakosha:
а зачем отрывать файл?
мне надо сделать именно как отдельную функцию.
так как сказал Drakosha всё работает, но всё равно как отдельная функция получается ошибка :confused:

помогите плиз сделать это как отдельную функцию

Цитата:

crawler:
Я тебе рекомендую посмотреть демки и их код, а также посмотри хелп на тему
Programming and Data Types: M-File Programming: Functions
да, я искал самые простые примеры функций чтоб разобраться, но что то не нашел.
где взять не подскажешь? :)

crawler 14.06.2004 13:20

Цитата:

inkognito:
где взять не подскажешь?
У тебя хелп не установлен ????????? Если нет- установи, без него работать невозможно, если да то в меню Матлаба Help->Full Product Family Help, а там выбираешь MATLAB->Programming and Data Types-> M-File Programming-> Functions

ты не можешь запускать функцию из дебаггера (окно редактора). Ты должен сделать скрипт (еще один файл) и запускать функцию через него, а не саму функцию.

в скрипте напиши:
Код:

X = magic(3);
res = abc (X);
disp (res);

и будет тебе счастье :p .

Комбинатор 15.06.2004 20:02

а чем скрипт отличается от функции?

а почему debug->step ne активный ? хотел посмотреть по ход функции по шагам но оно не активное чего то.. :confused:

вроде нашел как делать step там для этого бреёк поинт вроде надо ставить, но не пойму где отображаются значения переменых возле которых стоит стрелка

вроде нашел как делать step там для этого бреёк поинт вроде надо ставить, но не пойму где отображаются значения переменых возле которых стоит стрелка

crawler 16.06.2004 13:50

Серьезно почитай хелпы, там все написано.

Скрипт не принимает входных параметров и не возвращает значений. При вызове скрипта из кода не опускаешься по стеку функций и "скоп" остается тот же.

Значения можно посмотреть в редакторе (подведи к переменноймышку), или в окне самого матлаба (введи имя перемнной).

Комбинатор 27.03.2005 13:09

Скажите, как написать в matlab функцию которая делает accumulated histogram какой то картинки?

a_ber 05.04.2005 10:16

Сделать обычный histogram через hist или imhist, а далее просуммировать
a(i) = sum_{j=1:i} b(j) -- извини нет под рукой матлаба, по моему есть спецальная фунция для этого, но и руками не сложно...

Комбинатор 24.04.2007 13:16

надо написать в матлабе следущее:
(есть такая готовая функция но мне надо написать свою, что то в готовой не могу разобраться, сильно накрученная она)

HistEqual(X, Y)
Histogram equalization. After running this function, the histogram of X should be
as similar to the histogram of Y as possible, without changing the histogram of Y.
Return the new image after histogram equalization.


алгоритм следующий:

Equalize :For every original gray level k
1. Calculate the image histogram
2. Find the accumulative sum of the histogram values - yk (in Matlab – cumsum(vec))
3. Normalize the values of the histogram accumulative sum by dividing in the total number
of pixels
4. Multiple the normalized vector in the maximal gray level value (K-1)
and round (shift back to the original gray level range)
5. Map the gray levels values to the result of step (3)
6. Stretch the values back to the range 1,..K
(improve contrast in the end of this process)


вроде все ясно
но вот как сделать в матлабе пятый пункт не понимаю :(

помогите плиз
заранее спасибо

crawler 26.04.2007 11:02

Цитата:

что то в готовой не могу разобраться, сильно накрученная она
конечно, гораздо проще понять как она работает и написать ее самому :biggrin:
Код:

origImage = imread(<your_file1>); % Х
refImage = imread(<your_file2>); % У
refHist = hist(refImage, 256 ); % <- предполагается 256 уровней серого
newImage = histeq(origImage, refHist);

твой алгоритм - находит оптимальную фунцию для преобразования одной гистограммы в другую. Там получается график - на одной оси референсная гистограмма, на другой оригинальная. Таким образом для каждого оригинального цвета есть соответсвующий референсному. Ты просто подменяешь значения цветов - и в результате получаешь близкое сходство.

Комбинатор 27.04.2007 22:27

Цитата:

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

Цитата:

origImage = imread(<your_file1>); % Х
refImage = imread(<your_file2>); % У
refHist = hist(refImage, 256 ); % <- предполагается 256 уровней серого
newImage = histeq(origImage, refHist);
такой код и я написал
только histeq должна быть написана мной

Цитата:

Ты просто подменяешь значения цветов - и в результате получаешь близкое сходство.
я не понимаю как сделать замену цветов(уровней серого)
ведь гистограмма говорит о том сколько пикселов имеют такой-то уровень серого, я же не знаю какие именно пикселы


гистограмма оригинальной картинки
такая:

http://img78.***************img78/9462/origimagemr7.gif
зеркало
http://s.foto.radikal.ru/0704/13/08cc834d5100.gif

а гистограмма референсной картинки
такая:

http://img260.***************img260/6813/refimagerk8.gif
зеркало
http://s.foto.radikal.ru/0704/3e/f89dabc3ab0d.gif


не понимаю как сделать замену пикселов в картинке :rolleyes:

crawler 28.04.2007 11:05

В результате шагов 1-4 ты получаешь монотонно растущую (!)функцию "интеграла" нормализованной гистограммы референса. И такую же монотонно растущую функцию "интеграла" гистограммы оригинала. То есть по оси Х цвет, а по оси У - сколько процентов пикселов с цветом меньшим или равным данному. Теперь тебе надо подогнать оригинал под референс. В твоем случае первый значения в оригинале появляются в районе "цвета" 240 - 9000 пикселов с таким цветом. на гистограмме референса ты смотришь на каком цвете у тебя накопилось 9000 пикселов (допустим 40) - значит всем пикселам с цветом 240 с оригинала присваиваешь цвет 40. Затем берешь цвет 241 - снова 9000 пикселов. Значит на графике "интеграла" будет 18000. Смотришь на референсе какой цвет сответсвует 18000 - скажем 80. Всем пикселям с цветом 241 присваиваешь 80. И так далее.
Это для конкретного случая что ты привел, когда размеры картинок одинаковы. Шаг 3 (нормализация) позволяет сравнивать картинки разных размеров - убирает зависимость от реального размера картинки, и оставляет лишь процентную зависимость.
Удачи.

Комбинатор 29.04.2007 21:53

Цитата:

Сообщение от crawler (Сообщение 1400218)
В твоем случае первый значения в оригинале появляются в районе "цвета" 240 - 9000 пикселов с таким цветом. на гистограмме референса ты смотришь на каком цвете у тебя накопилось 9000 пикселов (допустим 40) -

а тут получается что на гистограме референса нет значения 9000 там максимальное значение ~220
что делать в этом случае?

даже если нормализирую две аккумулятивные гистограммы(пункт 3 в алгоритме) тоесть в одной и второй
значения от нуля до 1 то все равно там значения точно не совпадают

или я не правильно понял как делать надо ? :rolleyes:

crawler 30.04.2007 10:14

Ты смотришь на саму гистограмму что ли :rolleyes: на интеграл (cumsum) смотри гистограммы. Сама гистограмма - это сколько точек имеет какой цвет. А кумулятивная гистограмма (интеграл) - это сколько точек имееют цвет меньший либо равный К.
У тебя гистограмма референса ровная. 9000/220 - выходит 40 ;).

Возьми нормализованные графики интегралов гистограм. Это будут монотонно растущие функции в пределах [0..255, 0..1]. Цвет 240 имеет значение 0.15 ( то есть 9000 это 15% от общего количества точек- следовательно размер картинки 60К пикселов). Идешь на гистограмму референса смотришь где есть 0.15 - и конвертишь 240 в тот цвет. Смотришь цвет 241 - у него значениие будет уже 0.3 (хотя точек с цветом 241 столько (9000) же как и 240). Смотришь на интеграле гистограмы референса 0.3 - ставишь этот цвет. Тогда получиться что в процентном отношении цвета референса и оригинала совпадут (не учитывая ошибок квантизаации) - то что ты и искал.

EvroStandart 15.02.2012 14:15

Я матлаб незнаю, но

while i<=length(str)
...
i=i+1;
это перебор чисел от i до количества символов в стринге.

if (str(i)~=' ')
проверка символа на текущей позиции.

в зависимости от результата проверки делаются присвоения переменным.


Часовой пояс GMT +4, время: 20:46.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.