2016-12-14 5 views
1

Я ищу для создания евклидовой матрицы расстояния от одной точки [1,1]. Это то, что я, однако он не работает по назначению:Расстояния от одной точки

a=rand(10,10); 
a=sort(a); %sort example matrix it should be visible that distances should get bigger and bigger 
a=pdist([ones(size(a));a]); 

Пожалуйста, представьте матрицу 10х10 в виде изображения. Я хочу получить расстояния от точки А (здесь [1,1]) до ряда других точек, а именно от всей матрицы. Таким образом, ожидаемым форматом будет исходный размер матрицы 10x10, но со всеми расстояниями до точки A.

Есть ли простой способ сделать это, что работает?

+0

Так как же вы предлагаете, что вы собираетесь вычислить расстояние между 10-dimensinal точкой и 2 мерной точки? – Suever

+1

На последней строке отсутствует скобка. – beaker

+0

Так что я думал, что для каждого индекса [x, y] есть значение. Я просто хочу, чтобы это значение было расстоянием этой точки от [1,1]. Это имеет смысл? – user2305193

ответ

3

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

A = false(10, 10); 
A(1, 1) = true; 
B = bwdist(A); 

bwdist вычисляет distance transform, где каждое местоположение на выходе устанавливается таким образом, что, если соответствующий вход расположение false, расстояние от этого места до ближайшего ненулевого пикселя вычисляется. Для местоположений, которые являются true, выход естественно 0. Поскольку на входе в верхнем левом углу есть только один ненулевой пиксель, остальная часть изображения должна рассчитать расстояние до этого пикселя. Метод расстояния по умолчанию - это евклидово расстояние, за которым вы находитесь.

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

B = double(bwdist(A)); 

Пример Run

>> A = false(10, 10); 
>> A(1,1) = true; 
>> B = double(bwdist(A)) 

B = 

     0 1.0000 2.0000 3.0000 4.0000 5.0000 6.0000 7.0000 8.0000 9.0000 
    1.0000 1.4142 2.2361 3.1623 4.1231 5.0990 6.0828 7.0711 8.0623 9.0554 
    2.0000 2.2361 2.8284 3.6056 4.4721 5.3852 6.3246 7.2801 8.2462 9.2195 
    3.0000 3.1623 3.6056 4.2426 5.0000 5.8310 6.7082 7.6158 8.5440 9.4868 
    4.0000 4.1231 4.4721 5.0000 5.6569 6.4031 7.2111 8.0623 8.9443 9.8489 
    5.0000 5.0990 5.3852 5.8310 6.4031 7.0711 7.8102 8.6023 9.4340 10.2956 
    6.0000 6.0828 6.3246 6.7082 7.2111 7.8102 8.4853 9.2195 10.0000 10.8167 
    7.0000 7.0711 7.2801 7.6158 8.0623 8.6023 9.2195 9.8995 10.6301 11.4018 
    8.0000 8.0623 8.2462 8.5440 8.9443 9.4340 10.0000 10.6301 11.3137 12.0416 
    9.0000 9.0554 9.2195 9.4868 9.8489 10.2956 10.8167 11.4018 12.0416 12.7279 
+2

Я совсем забыл про 'bwdist': D – beaker

+0

@beaker: D Это не произошло со мной, пока я не увидел комментарий. ОП просто хочет преобразование расстояния. – rayryeng

+0

Удивительно, я не нашел функцию как-то! Благодаря! – user2305193

2

Вы можете использовать pdist2, чтобы сделать это, но тогда вам придется получить координаты сетки, вычислить расстояния, а затем изменить его обратно в матрицу, так что я просто рассчитать расстояние напрямую:

point = [1 1]; % point to calculate distance from 
imgRows = 10; % grid size 
imgCols = 10; 

a = sqrt(([1:imgRows].' - point(1)).^2 + ([1:imgCols] - point(2)).^2); 

Если вы не используете последнюю версию MATLAB (или октава) с автоматическим вещания, вам нужно использовать версию bsxfun вместо:

a = bsxfun(@(x,y) sqrt(x.^2 + y.^2), ([1:imgRows] - point(1)).', ([1:imgCols] - point(2))); 

Результат:

a = 

    0.00000 1.00000 2.00000 3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 
    1.00000 1.41421 2.23607 3.16228 4.12311 5.09902 6.08276 7.07107 8.06226 9.05539 
    2.00000 2.23607 2.82843 3.60555 4.47214 5.38516 6.32456 7.28011 8.24621 9.21954 
    3.00000 3.16228 3.60555 4.24264 5.00000 5.83095 6.70820 7.61577 8.54400 9.48683 
    4.00000 4.12311 4.47214 5.00000 5.65685 6.40312 7.21110 8.06226 8.94427 9.84886 
    5.00000 5.09902 5.38516 5.83095 6.40312 7.07107 7.81025 8.60233 9.43398 10.29563 
    6.00000 6.08276 6.32456 6.70820 7.21110 7.81025 8.48528 9.21954 10.00000 10.81665 
    7.00000 7.07107 7.28011 7.61577 8.06226 8.60233 9.21954 9.89949 10.63015 11.40175 
    8.00000 8.06226 8.24621 8.54400 8.94427 9.43398 10.00000 10.63015 11.31371 12.04159 
    9.00000 9.05539 9.21954 9.48683 9.84886 10.29563 10.81665 11.40175 12.04159 12.72792 
Смежные вопросы