Чего лучший способ состоит в том, чтобы выполнить итерации через столбцы матрицы?

Мне удалось решить таким образом. Я создал эту функцию

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)

Таким образом, я добавляю панель инструментов навигации внизу холста.

10
задан 10 revs, 3 users 57% 15 December 2018 в 05:11
поделиться

6 ответов

Ваше решение прекрасно.

Обратите внимание, что horizcat требует существенную потерю производительности для больших матриц. Это заставляет код быть O (N^2) вместо O (N). Для 100x10,000 матрица, Ваша реализация занимает 2,6 с на моей машине, horizcat, каждый занимает 64,5 с. Для 100x5000 матрица, horizcat реализация занимает 15,7 с.

Если бы Вы хотели, то Вы могли бы обобщить свою функцию немного и заставить ее смочь выполнить итерации по заключительному размеру или даже по произвольным размерам (не просто столбцы).

3
ответ дан 3 December 2019 в 21:24
поделиться

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(:));

вызвать его в столбец.

9
ответ дан 3 December 2019 в 21:24
поделиться

Не забывайте предварительно выделять матрицу результата, если Вы имеете дело с большими матрицами. Иначе Ваш ЦП потратит много циклов, неоднократно перераспределяющих матрицу каждый раз, когда это добавляет новую строку/столбец.

1
ответ дан 3 December 2019 в 21:24
поделиться

Возможно, Вы могли всегда преобразовывать матрицу с 'оператором и затем преобразовывать результат назад.

smoothed = smooth(input', 9)';

Это, по крайней мере, работает с функцией fft.

2
ответ дан 3 December 2019 в 21:24
поделиться

Способ вызвать неявный цикл по столбцам Матрица должна использовать 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
2
ответ дан 3 December 2019 в 21:24
поделиться

Если бы это - общий пример использования для Вашей функции, это, возможно, была бы хорошая идея заставить функцию выполнить итерации через столбцы автоматически, если вход не является вектором.

Это точно не решает Вашу проблему, но она упростила бы использование функций. В этом случае вывод должен быть матрицей, также.

Можно также преобразовать матрицу к одному длинному столбцу при помощи m(:,:) = m(:). Однако это зависит от Вашей функции, если это имело бы смысл.

0
ответ дан 3 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: