Материал: Matlab. Практический подход. Самоучитель

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Самоучитель Matlab

В ячейку C3 вводится и выполняется формула =MLEvalString("B= inv(A)"). Функция MLEvalString() позволяет выполнять команды среды Matlab. Команды (в двойных кавычках) указываются аргументом функции MLEvalString(). Если команд несколько, они разделяются точкой с запятой. В данном случае команда одна: B=inv(A). Именно такую команду нам надо было бы выполнить в командном окне Matlab, если бы мы работали непосредственно с приложением Matlab. Результат команды такой: в переменную B записывается результат выражения inv(A), то есть обратная матрица к той, что записана в переменную A. После того, как обратная матрица вычислена, содержимое переменной B из рабочего пространства Matlab необходимо импортировать в рабочий документ Excel. Для этого в ячейку C4 и вводится формула =MLGetMatrix("B";"E12"). Функцией MLGetMatrix() элементы матрицы (первый аргумент функции) рабочего пространства Matlab копируются в ячейки диапазона, указанного вторым аргументом функции. Оба аргумента заключаются в двойные кавычки. Если вторым аргументом указана одна ячейка, то она определяет верхнюю левую ячейку заполняемого в Excel диапазона. В данном случае диапазон ячеек E12:G14 будет заполнен элементами матрицы, обратной к исходной (диапазон ячеек E2:G4).

На заметку

В ячейки диапазона E12:G14 копируются числовые значения, а не формулы. Это обстоятельство достаточно важно для понимания принципов использования надстройки Spreadsheet Link EX.

Теперь проверим, что произошло в рабочем пространстве Matlab. Для этого в командном окне проверяем значения переменных A и B, как показано на рис. В.8.

Видим, что и переменная A, и переменная B содержат корректные значения. Причем стоит обратить внимание, что непосредственно в рабочем документе Matlab мы эти переменные не объявляли.

На заметку

Вышемыиспользовалитривстроенныефункциинадстройки:MLPutMatrix(), MLEvalString() и MLGetMatrix(). При успешном выполнении функции возвращают в качестве значения 0. Это характерная ситуация для функций надстройки Spreadsheet Link EX. Здесь проявляется принципиальное отличие функций надстройки от встроенных функций Excel. Встроенные функции Excel возвращают результат, а функции надстройки выполняют действия.

Несмотря на кажущуюся эффективность описанного выше подхода, есть одна маленькая проблема, которая может стать достаточно большой. Связана она с автоматическим пересчетом содержимого документа Excel (с формулами на основе функций надстройки Spreadsheet Link EX) при изменении данных в ячейках документа. Проиллюстрируем это на примере с ранее

436

Приложение В. Надстройка для работы с Excel

созданным документом. Для этого меняем, например, значение в ячейке E4 с 0 на 1, как показано на рис. В.9.

Рис. В.8. Проверка значений переменных в командном окне Matlab

Рис. В.9. Изменение содержимого ячейки E4 не приводит к пересчету результата

в ячейках E12:G14

437

Самоучитель Matlab

Если результат в ячейках E7:G9, вычисленный на основе встроенной функции МОБР(), автоматически пересчитан, то ячейки диапазона E12:G14 остались неизменными. При этом если проверить содержимое переменных A и B, то значение переменной A изменилось, а значение переменной B – нет (рис. В.10).

Рис. В.10. Проверка значений переменных A и B

Дело в том, что в Excel при изменении ячеек пересчитываются те ячейки, которые содержат зависимые ячейки (то есть ячейки, которые содержат формулы со ссылкой на изменяемые ячейки). Поэтому если изменить ячейку в диапазоне E2:G4, то значение в ячейке C2 пересчитывается, поскольку формула в ячейке содержит ссылку на диапазон E2:G4. В результате переменная A в рабочем пространстве Matlab получает новое значение. А значение в ячейке C3 не пересчитывается, поскольку формула в этой ячейке не содержит ссылок ни на ячейку C2, ни на ячейки диапазона E2:G4.

Проблему можно решать по-разному. Общая идея состоит в том, чтобы изменить формулы в ячейках C2 и C3 так, чтобы они изменялись при изменении ячеек в диапазоне E2:G4. Не мудрствуя лукаво, вводим в ячейку C3

формулу =MLEvalString("B=inv(A)")+СУММ(E2:G4), а в ячейку C4

вводим формулу =MLGetMatrix("B";"E12")+C3. В первом случае не особенно важно, какая использована "дополнительная" функция – главное, чтобы она содержала весь диапазон ячеек E2:G4 и чтобы значение этой "дополнительной" функции менялось при изменении значения хотя бы одной ячейки. В рассматриваемом случае функция СУММ() вполне подходит. В результате при успешном вычислении формулы =MLEvalString

438

Приложение В. Надстройка для работы с Excel

("B=inv(A)")+СУММ(E2:G4) в ячейке C3 отображается сумма ячеек диапазона E2:G4. Сам по себе этот факт маловажен. Намного важнее то, что формула содержит ссылку на диапазон ячеек E2:G4. Это означает, что при изменении ячеек диапазона E2:G4 будет пересчитываться и значение

вячейке C3, чего мы, собственно, и добивались. Более того, изменение ячейки диапазона E2:G4 приводит к изменению значения ячейки C3. Ссылка на эту ячейку содержится в формуле =MLGetMatrix("B";"E12")+C3

вячейке C4. Поэтому пересчитывается значение и в этой ячейке. На рис. В.11 показан документ Excel с внесенными в него изменениями.

Рис. В.11. В формулы в ячейках C3 и C4 внесены изменения

ДляконтролярезультатавячейкуE4вместоисходногозначения0вводимзначение 1. В результате выполняется пересчет документа, как показано на рис. В.12.

Рис. В.12. После изменения ячейки в диапазоне E2:G4 корректно вычисляются значения

ячеек диапазона E12:G14

439

Самоучитель Matlab

Видим, что обратная матрица, вычисленная путем использования средств Matlab, совпадает с обратной матрицей, вычисленной средствами Excel.

Разумеется, что в общем случае приложение Matlab используется совместно с приложением Excel для решения более сложных задач – как правило, таких, которые не могут быть решены (или которые сложно решать), используя только утилиты Excel.

440

Источник: https://studfile.net/preview/16433384/