значение результата изменяется при компиляции в matlab 6.5 и 7.5 - PullRequest
0 голосов
/ 30 апреля 2011

Я получаю разные результаты между версиями 6.5 и 7.5. Вот результат для 6,5

corr_a1=[10 49  1   25  6   3   47  4475    20  2017    14  23  3   29  9   47  4   5   21  2019    53  6280    23  26  0   23  8   17  907 13  13  19  5   18  14  10  ];

и вот результат для 7,5

corr_a1=[6  17  0   14  3   7   18  5242    3   1271    3   7   1   4   3   14  0   0   13  1289    15  7353    17  11  2   14  1   8   893 0   7   8   0   8   2   2   ];

Мой код выглядит следующим образом:

img1=imread(fn);%reading image

img=imresize(img1,[128 128]);

img=double(img);

img_red=img(:,:,1);

img1_red=repmat(img_red,[1 1 3]);

img_green=img(:,:,2);

img1_green=repmat(img_green,[1 1 3]);

img_blue=img(:,:,3);

img1_blue=repmat(img_blue,[1 1 3]);

siz=size(img);


%initialising color categories for image

r_maxb_min=zeros(siz);

r_maxg_min=zeros(siz);

g_maxr_min=zeros(siz);

g_maxb_min=zeros(siz);

b_maxr_min=zeros(siz);

b_maxg_min=zeros(siz);

%1=RmaxGmin
%2=RmaxBmin
%3=GmaxGmin
%4=GmaxBmin
%5=BmaxRmin
%6=BmaxGmin

%representation of image with color categories

for row=1:siz(1)

        for col=1:siz(2)

       r=img_red(row,col);

       g=img_green(row,col);

       b=img_blue(row,col);

        a1=[r,g,b];

        if (max(a1)==r) & (min(a1)==g)

          r_maxg_min(row,col)=r_maxg_min(row,col)+img(row,col);

          img(row,col)=1;

          elseif (max(a1)==r) & (min(a1)==b)

          r_maxb_min(row,col)=r_maxb_min(row,col)+img(row,col);

          img(row,col)=2;

        end

        end
end



for row1=1:siz(1)

        for col1=1:siz(2)

       r1=img_red(row1,col1);

       g1=img_green(row1,col1);

       b1=img_blue(row1,col1);

        a2=[r1,g1,b1];

        if (max(a2)==g1) & (min(a2)==r1)

         g_maxr_min(row1,col1)=g_maxr_min(row1,col1)+img(row1,col1);

         img(row1,col1)=3;

          elseif (max(a2)==g1) & (min(a2)==b1)

          g_maxb_min(row1,col1)=g_maxb_min(row1,col1)+img(row1,col1);

          img(row1,col1)=4;

        end

        end
end



for row2=1:siz(1)

        for col2=1:siz(2)

       r2=img_red(row2,col2);

       g2=img_green(row2,col2);

       b2=img_blue(row2,col2);

        a3=[r2,g2,b2];

        if (max(a3)==b2) & (min(a3)==r2)

         b_maxr_min(row2,col2)=b_maxr_min(row2,col2)+img(row2,col2);

         img(row2,col2)=5;

          elseif (max(a3)==b2) & (min(a3)==g2)

          b_maxg_min(row2,col2)=b_maxg_min(row2,col2)+img(row2,col2);

          img(row2,col2)=6;

        end

        end
end


b_maxr_min;
b_maxg_min;
g_maxr_min;
g_maxb_min;
r_maxg_min;
r_maxb_min;

set1=[r_maxg_min r_maxg_min g_maxr_min g_maxb_min b_maxr_min b_maxg_min];

result=img(:,:,1);

siz_res=size(result);

img1;

result;

%constructing color corellogram

max_res=max(max(result));

corr=zeros(max_res,max_res);

dy=1;
dx=0;
for row=1:siz_res(1)-dx

    for col=1:siz_res(2)-dy

        i=result(row,col);

        j=result(row+dx,col+dy);

         corr(i,j)=corr(i,j)+1;

        end

    end

corr;
corr_a1=corr(:)';

1 Ответ

0 голосов
/ 30 апреля 2011

Я не знаю, что не так в обеих версиях, но вот несколько замечаний и советов, как решить эту проблему:

  • Я бы лично использовал im2double, если это доступно в обеих версиях
  • При решении вашей проблемы вы можете попытаться сузить суть проблемы, скорее всего, ошибка может быть где-то в начале, распространяясь по всему коду и давая неправильный вывод.

Практически я вижу этот последний шаг следующим образом: вы запускаете код одновременно в MATLAB 6.5 и MATLAB 7.5. Однако между каждым большим сегментом кода вы помещаете %%. В MATLAB 7 это позволяет вам запускать этот код в «режиме ячейки», так что вы можете легко выполнить только эту ячейку (сегмент) кода.

В MATLAB 6.5 вам придется эмулировать это поведение (однако вы можете оставить %% в своем коде в качестве визуальных подсказок), выполняя части кода вручную. Вы начинаете с выполнения первой ячейки, а затем экспортируете переменные рабочего пространства из MATLAB 6.5:

 save();

И в MATLAB 7.5 вы импортируете те же переменные, что и в struct:

 matlab65 = load();

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

 matlab65 = load();
 fields = fieldnames(matlab65)
 for iField = 1:numel(fields)
     variable = fields{iField};
     if any((eval(sprintf('%s ~= matlab65.%s',variable,variable))))
         fprintf(1,'%s is not equal',variable);
     end
 end
 clear fields variable iField

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...