Мне удалось решить таким образом. Я создал эту функцию
def _initialize_widget(self,widget):
"""
function that:
- initialises every tab (widget)
- add layout
- add navigation toolbar and position it at the bottom of the tab
:param widget:
:return:
"""
widget.figure.clear()
widget.draw()
widget.setLayout(QtGui.QVBoxLayout())
widget.layout().setContentsMargins(0, 710, 50, -0)#(left, top, right, bottom)
widget.layout().setSpacing(0)
toolbar = NavigationToolbar(widget, self)
widget.layout().addWidget(toolbar)
widget.figure.clear()
widget.draw()
и затем инициализирую виджеты (canvas)
self._initialize_widget(self.widget_LID1)
Таким образом, я добавляю панель инструментов навигации внизу холста.
Ваше решение прекрасно.
Обратите внимание, что horizcat требует существенную потерю производительности для больших матриц. Это заставляет код быть O (N^2) вместо O (N). Для 100x10,000 матрица, Ваша реализация занимает 2,6 с на моей машине, horizcat, каждый занимает 64,5 с. Для 100x5000 матрица, horizcat реализация занимает 15,7 с.
Если бы Вы хотели, то Вы могли бы обобщить свою функцию немного и заставить ее смочь выполнить итерации по заключительному размеру или даже по произвольным размерам (не просто столбцы).
MATLAB "для" оператора на самом деле циклично выполняется по столбцам того, что предоставило - обычно, это просто приводит к последовательности скаляров, так как вектор передал в для (как в Вашем примере выше), вектор - строка. Это означает, что можно переписать вышеупомянутый код как это:
function result = map_column(m, func)
result = [];
for m_col = m
result = horzcat(result, func(m_col));
end
Если func не возвращает вектор - столбец, то можно добавить что-то как
f = func(m_col);
result = horzcat(result, f(:));
вызвать его в столбец.
Не забывайте предварительно выделять матрицу результата, если Вы имеете дело с большими матрицами. Иначе Ваш ЦП потратит много циклов, неоднократно перераспределяющих матрицу каждый раз, когда это добавляет новую строку/столбец.
Возможно, Вы могли всегда преобразовывать матрицу с 'оператором и затем преобразовывать результат назад.
smoothed = smooth(input', 9)';
Это, по крайней мере, работает с функцией fft.
Способ вызвать неявный цикл по столбцам Матрица должна использовать cellfun. То есть сначала необходимо преобразовать матрицу в массив ячеек, каждая ячейка будет содержать один столбец. Тогда позвоните в cellfun. Например:
A = randn(10,5);
Посмотрите, что здесь я вычислил стандартное отклонение для каждого столбца.
cellfun(@std,mat2cell(A,size(A,1),ones(1,size(A,2))))
ans =
0.78681 1.1473 0.89789 0.66635 1.3482
Конечно, многие функции в MATLAB уже настроены для работы со строками или столбцами массива, как указывает пользователь. Это правда, конечно, но это удобный способ проверить, что cellfun
работал успешно.
std(A,[],1)
ans =
0.78681 1.1473 0.89789 0.66635 1.3482
Если бы это - общий пример использования для Вашей функции, это, возможно, была бы хорошая идея заставить функцию выполнить итерации через столбцы автоматически, если вход не является вектором.
Это точно не решает Вашу проблему, но она упростила бы использование функций. В этом случае вывод должен быть матрицей, также.
Можно также преобразовать матрицу к одному длинному столбцу при помощи m(:,:) = m(:)
. Однако это зависит от Вашей функции, если это имело бы смысл.