2016-01-05 3 views
1

Я ищу однострочный набор для получения нескольких осей ручек сразу в массиве объектов, чтобы его можно было передать в linkaxes. Я специально ищу однострочный оператор, который не использует циклы. Я знаю, что в прошлом я делал пару вложенных функций, но я не могу понять, что я сделал.Получить сразу несколько точечных ручек

Функция gca может использоваться для получения рукоятки осей для определенной фигуры, хотя эта функциональность не задокументирована. Например, вызовите gca(3), чтобы получить ось оси для рисунка 3. Я думал, что в прошлом я мог позвонить gca([1:4]), чтобы получить все четыре оси, но это не работает.

Я знаю, что могу использовать get, позвонив get([1:4],'currentaxes'), который возвращает массив ячеек осей. Тем не менее, я не понял способ преобразования массива ячеек объектов в массив объектов.

Я использую MATLAB R2015a.

+0

Созданы ли фигуры и/или оси таким образом, чтобы вы не могли хранить их ручки? – excaza

ответ

3

Наряду с уже полученными ответами возможно однолинейное решение:

linkaxes(findobj('type','axes')) 

он также позволяет неявно предотвратить рассмотрение figure без axes.

Надеюсь, это поможет.

2

Как насчет этого?

cell_of_axes = get([1:4], 'currentaxes'); 
array_of_axes = [cell_of_axes{:}]; 
linkaxes(array_of_axes); 
+0

Хм, это действительно работает, и, конечно, лучше, чем цикл for, хотя я надеялся на одно утверждение. Однако это может быть невозможно. –

+0

Да, синтаксис MATLAB не позволяет сделать это одним слоем, поскольку вы не можете добавить {:} до конца вызова, чтобы получить (...). –

+1

@ThomasIbbotson [это не совсем верно] (http://stackoverflow.com/questions/3627107/how-can-i-index-a-matlab-array-returned-by-a-function-without-first-assigning- it) – excaza

3

После построения осей:

figure(1); axes(); 
figure(2); axes(); 
figure(3); axes(); 

однострочечники весело:

linkaxes(arrayfun(@(k) get(k,'CurrentAxes'), 1:3)); 

Позже Редактировать

Видимо, это работает только для графики старого стиля (в котором дескриптор графического объекта является double). Новая ручка графика (быть соответствующие объекты) не могут накапливаться в одном массиве по arrayfun:

http://www.mathworks.com/help/matlab/graphics_transition/graphics-handles-are-now-objects-not-doubles.html

Может быть гораздо проще один вкладыш:

linkaxes(findobj(1:3,'Type','Axes')); 

будет работать ...

+0

Мне сказали, что мне нужно установить '' UniformOutput'' как 'false', что приводит к массиву ячеек и, следовательно, несовместимо с' linkaxes'. С этим не случается? –

+0

@DavidK у вас есть цифры без осей?Если да, удалите их из массива (например, от 1: 3). –

+0

@DavidK Также: он работает для кода примера, который я дал? –

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