Инициализация ublas вектора от массива C

Этот код VBA обновит все таблицы/диаграммы центра в рабочей книге.

Sub RefreshAllPivotTables()

Dim PT As PivotTable
Dim WS As Worksheet

    For Each WS In ThisWorkbook.Worksheets

        For Each PT In WS.PivotTables
          PT.RefreshTable
        Next PT

    Next WS

End Sub

Другая non-programatic опция:

  • Щелчок правой кнопкой по каждой сводной таблице
  • опции Select Table
  • Галочка 'Обновление на открытом' опция.
  • Нажимают на кнопку OK

, Это обновит сводную таблицу каждый раз, когда рабочая книга открыта.

6
задан dzhelil 14 November 2009 в 22:53
поделиться

3 ответа

Оба std :: vector и ublas :: vector являются контейнерами. Весь смысл контейнеров состоит в том, чтобы управлять хранением и сроками жизни содержащихся в них объектов. Вот почему, когда вы инициализируете их, они должны копировать значения в хранилище, которым они владеют.

Массивы C - это области памяти с фиксированным размером и местоположением, поэтому по их природе вы можете получить их значения в контейнер только путем копирования.

Вы можете использовать массивы C в качестве входных данных для многих функций алгоритмов, так что, возможно, вы сможете сделать это, чтобы избежать первоначальной копии?

6
ответ дан 8 December 2019 в 03:39
поделиться

Я не уверен, как ваш вопрос относится к MATLAB / MEX, но примечание: вы можете знать, что MATLAB реализует стратегию copy-on-write .

Это означает, что когда вы, например, копируете массив, фактически копируются только некоторые заголовки, а сами данные распределяются между двумя массивами. И как только один из них изменяется, фактически создается копия данных.

Ниже приводится моделирование того, что может происходить под капотом (заимствовано из этого старого сообщения ):

-----------------------------------------
>> a = [35.7 100.2 1.2e7];

 mxArray a
    pdata -----> 35.7 100.2 1.2e7
  crosslink=0

-----------------------------------------
>> b = a;

 mxArray a
    pdata -----> 35.7 100.2 1.2e7
  crosslink     / \
    |  / \       |
    |   |        |
    |   |        |
   \ /  |        |
   crosslink     |
 mxArray b       |
    pdata --------

-----------------------------------------
>> a(1) = 1;

mxArray a
    pdata -----> (1) 100.2 1.2e7
  crosslink=0


   crosslink=0
 mxArray b
    pdata ------> 35.7 100.2 1.2e7 ...

Я знаю, что это не совсем ответ на ваш вопрос, я просто подумал, что эта концепция может вам помочь.

8
ответ дан 8 December 2019 в 03:39
поделиться

Вы можете легко инициализировать std :: vector из массива C:

vector<int> v(pv, pv+10);
4
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

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