Операции с массивами в Matlab

Я хотел бы, чтобы функция вычисляла следующую операцию: введите здесь описание изображения

Я сделал эту функцию, которая требует на входе матрицу и возвращает расстояния между каждыми двумя ее строками в другой матрице.

Определение RGB_dist_full:

function[D]=RGB_dist_full(x)

I = nchoosek(1:size(x,1),2);

D = RGB_dist(x(I(:,1),:), x(I(:,2),:));
squareform(D)

end

Определение RGB_dist:

function[distance]=RGB_dist(x,y)

  distance=sqrt(sum((x-y).^2*[3;4;2],2));

end

Основная программа выглядит так:

    clc
    clear all

    rgbImage = imread('peppers.png');
    K=6;
    N=uint64(K*2); 

    rgb_columns = reshape(rgbImage, [], 3); 
    [unique_colors, m, n] = unique(rgb_columns, 'rows','stable'); 
    color_counts = accumarray(n, 1);

    [max_count, idx] = max(color_counts);

    Imgsize=size(rgbImage);

    U=unique_colors(1:N,:)
    size(U)

x=[62,29,64;
    63,31,62;
    65,29,60;
    63,29,62;
    63,31,62;];

   RGB_dist_full(x);
   RGB_dist_full(U);

Почему я получаю сообщение «Ошибка при использовании * MTIMES не полностью поддерживается для целочисленных классов. По крайней мере один вход должен быть скалярным. Чтобы поэлементно вычислить TIMES, используйте вместо этого TIMES (.*). для второго вызова функции, тогда как первый возвращает желаемый результат?


person Tanatos Daniel    schedule 25.06.2014    source источник
comment
хорошо, почему вы хотите сохранить это целое число для начала (sqrt (целое число) обычно не является целым числом)? просто double(rgbImage) и продолжай...   -  person bla    schedule 25.06.2014
comment
@natan Действительно, это решило проблему.   -  person Tanatos Daniel    schedule 25.06.2014
comment
Я добавлю это как ответ тогда...   -  person bla    schedule 26.06.2014
comment
@TanatosDaniel Я сказал вам сделать это в предыдущем вопросе, который вы задали об этой же процедуре, и вы приняли мой ответ .... Любопытно, почему вы спрашиваете об этом снова. stackoverflow.com/questions/24398054/   -  person rayryeng    schedule 26.06.2014
comment
Ой. Ты сделал. Мне жаль. Я прочитал ваш пост в спешке, мне показалось, что решения отсюда link, и это я отмечено, что это ответ. Я должен был прочитать это полностью. С этого момента я буду осторожнее. Спасибо!   -  person Tanatos Daniel    schedule 26.06.2014


Ответы (1)


Для этих типов вычислений вы хотите привести к точности double, потому что sqrt(integer) обычно не является целым числом. Для этого достаточно double(rgbImage) сразу после прочтения изображения.

person bla    schedule 25.06.2014