2014-11-28 2 views
1

У меня есть несколько городов, в этих городах есть несколько соседей, и число этих соседей не похоже.
У меня есть функция:Гибкий массив в matlab

function [cityN,neighbor,neghbor2:neghborN]] = makeneighbor(x,y) 
cityN=x; 
neighbor=y; 
end % this function is false and i just told what is in my mind 

, например:

//city1 have 2 neighbors: 
    [city1,neighbor1,neghbor2] 

    //but city2 have 4 neighbors: 
    [city2,neighbor1,neghbor2,neighbor3,neghbor4] 

    //and city3 have just a neighbor 
    [city3,neighbor1] 

я нужен flixeble массив для этого, большое спасибо ...

+0

'cell' будет делать то, что у вас на уме. – Rashid

+0

@ Камтал как? Можешь сказать мне? – sajad

+0

Я не понимаю, что должна делать ваша функция, но вы можете использовать 'A {1} = [city1, neighbour1, neghbor2];' и 'A {2} = [city2, соседний1, neghbor2, сосед3, neghbor4 ] 'и не будет никаких проблем с размером. – Rashid

ответ

1

Вы можете использовать adjacency matrix

cities = {'City1','City2', 'City3', 'City4'} 

A = 

    0 1 0 1 (1 is neighbours with 2 and 4) 
    1 0 1 0 (2 is neighbours with 1 and 3) 
    0 1 0 0 (3 is only neighbours with 2) 
    1 0 0 0 (4 is only neighbours with 4) 

(A должен иметь тип логического)

Тогда для любого города, список соседей:

n = strfind('City1',cities); 
neighbours = cities(A(n,:)); 

И этот список с собой и соседями будет

self_neighbours = [cities(n),cities(A(n,:))]; 

Количество числа соседей просто:

num_neighbours = sum(A(n,:)); 

Преимущества ведения списка, который соседствует с кем в что-то вроде матрицы смежности, так это упрощает выполнение расчетов. Если у вас есть доступ к Bioinformatics Toolbox, вы также можете использовать его для различных полезных вещей:

b = biograph(A,cities); %makes biograph object 
view(b); % shows connection between cities 
[dist,path,pred] = shortestpath(b,1,3); % finds path between 1 and 3 
1

Не уверен, что это это именно то, что вам нужно , но:

all_cities = {} 
all_cities{end+1} = {'New York','Boston', 'Mscow'} 
all_cities{end+1} = {'Moscow','Town1', 'St.Petersburg'} 

Все города представляют собой массив ячеек, содержащий al л городов. Каждый элемент этого массива ячеек также является массивом ячеек. Каждый массив вложенных ячеек содержит в качестве первого элемента главный город, от второго элемента до последнего один соседний.

Скажем, если мы говорим о Нью-Йорке,

new_york = all_cities{1}; 
new_york_neighbors = new_york{2:end}; 

Вы должны также проверить, если new_york_neighbors пуст при обработке его. Функция использования isempty()

1

Я не совсем уверен, понял ли я ваш вопрос. Для обработки различных размеров массива можно вернуть на структуру для makeneighbor функции с 1 полем, содержащим название города и второе поле, которое содержит массив ячеек со всеми окрестностями:

function [] = main_func() 

x1 = 'new york'; 
y1 = {'brooklyn'; 'queens'}; 
city1 = makeneighbor(x1, y1); 

x2 = 'los angeles'; 
y2 = {'hollywood'; 'downtown'; 'mid-city'; 'bel air'}; 
city2 = makeneighbor(x2, y2); 

% acces to cities 
city1.name 
city1.neighbor 

city2.name 
city2.neighbor 

end 

% function that returns a struct 
function city = makeneighbor(x, y) 

% generate struct with two fields 
city.name = x; 
city.neighbor = y; 

end 
+0

Это тоже может работать. – Rashid

Смежные вопросы