Как написать это элегантно (массивы и структуры ячеек в MATLAB) - PullRequest
2 голосов
/ 10 ноября 2011

Я бы хотел построить связанные точки в MATLAB.

Мои подключенные точки происходят из соединяющихся объектов "stats" , где каждый "stat" происходит из BW regionprops struct.

Код, который я написал, работает, но он страдает от многих "уродливых" , которые я не мог исправить даже после попытки различными способами.

function plot_line( line )

a = cell2mat(line);
b = {a.Centroid};

matx = {};
maty = {};

for i = 1:size(b,2)
    matx{end+1} = b{i}(1);
    maty{end+1} = b{i}(2);
end

plot ( cell2mat(matx), cell2mat(maty) );

end

Можете ли вы помочь мне сделать этот код лучше? Это не критично, так как мой код работает нормально, а строки короткие (<100 баллов), производительность не является проблемой. </p>

Просто было бы очень приятно узнать, как эта крошечная функция должна быть написана надлежащим образом, без циклов for и 3 вызовов cell2mat.

В моем примере:

  • строка - это <1xn cell>,
  • line{1} имеет свойство 'Centroid' и
  • line{i}.Centroid(1) - координаты х и
  • line{i}.Centroid(2) - координаты y.

На самом деле все, что мне нужно, это заговор line{i}.Centroid(1), line{i}.Centroid(2) для i = 1:size(line,2), но я не знаю как.

Ответы [ 2 ]

2 голосов
/ 10 ноября 2011

Вместо создания массива ячеек b, вы можете создать числовой массив напрямую путем объединения с помощью CAT :

tmp = cat(1,line{:});

coordinates = cat(1,tmp.Centroid);

plot(coordinates(:,1),coordinates(:,2))

EDIT

Если вы хотите, чтобы он был действительно коротким (то есть даже короче, чем @ решение Амро , вы можете использовать CELLFUN следующим образом, чтобы получить однострочник:

plot(cellfun(@(x)x.Centroid(1),line),cellfun(@(x)x.Centroid(2),line))
1 голос
/ 10 ноября 2011

Пример:

line = repmat({struct('Centroid',[1 2])},1,5);   %# similar to the data you have

%# extract x/y coordinates
x = cellfun(@(s)s.Centroid(1),line)
y = cellfun(@(s)s.Centroid(2),line)

%# plot
plot(x,y)

Вы также можете сделать это как:

xy = cell2mat(cellfun(@(s)s.Centroid, line, 'UniformOutput',false)');
plot(xy(:,1),xy(:,2))
...