Поднять матрицу до мощности без VBA

Мне нужно поднять матрицу до большой степени (скажем, 200), и я не могу использовать VBA, потому что он предназначен для конечного пользователя, чьи ИТ-службы не позволяют запускать макросы.

Кроме того, поскольку мощность велика, недостаточно написать очень большую формулу, например:

  = MMULT (m, MMULT (m, MMULT (m.  ....)))  

Где m — это диапазон моей матрицы.

Есть ли способ сделать это, не прибегая к VBA?

Я осмотрелся, и пока кажется, что ответ отрицательный.


Вы можете сделать это с помощью итеративного расчета

  • установите флажок: файл — параметры — формулы — «включить итерационные вычисления» (из версии Excel 2007).
  • установить значение «максимальное количество итераций» на число достаточно большой (это максимальная мощность, на которую вы можете поднять матрицу)

  • Формула во вспомогательной ячейке:
    = IF (ISNUMBER (G2), IF (G2 = E2, TEXT (G2, "0"), G2 + 1), IF (VALUE (G2) = E2, G2,1))
  • Формула в матрице результатов:
    = IF (ISNUMBER (G2), IF (G2 = 1, A2: C4, MMULT (A2: C4, H2: J4)), H2: J4)
    ( это формула массива, необходимо завершить нажатием CTRL + SHIFT + ENTER)

Примечания

  • Формула пересчитана ТОЛЬКО если вы ИЗМЕНИТЕ МОЩНОСТЬ , она не будет пересчитана после изменения только входной матрицы, ни при пересчете всех формул (может быть выполнено, но требует более сложной формулы и большего количества вспомогательных ячеек, дайте мне знать, если вам это интересно).
  • Также, после ввода обеих формул, выходная матрица будет показывать только 0 значений, чтобы вычислить ее, вам нужно изменить мощность, от этого лист будет «инициализирован», он будет работать без проблем.
  • проверка ошибок еще не реализована в формуле:
    • if power> максимальное количество итераций, то формула будет выполняться только в то время, когда установлено количество итераций
    • аналогично, для нецелых или отрицательных чисел формула не остановится, а будет выполняться до максимального количества итераций
    • после достижения максимального количества итераций формула будет «переполняться» вперед, не начиная с 0, чтобы исправить это, установите мощность, которая будет достигнута в следующем цикле итерации (например, если helper = 500, максимальное количество итераций = 100, затем установите 500
  • большинство проблем, описанных выше, при необходимости можно исправить с помощью формулы.

update

Ответьте на этот вопрос, опишите подробнее, как работает формула.


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

  Функция PowerMatrix (матрица как диапазон, мощность как долго) как  Вариант Dim Result как вариант Dim Square As Variant Dim i As Long Square = Matrix For i = от 0 до 31 If (Power And 2 ^ i) Then If IsEmpty (Result) Then Result = Square Else Result = Application.WorksheetFunction.MMult (Square  , Результат) End If End If If 2 ^ i> = Power Then Exit For Square = Application.WorksheetFunction.MMult (Square, Square) Next PowerMatrix = ResultEnd Function  

Если вы не можете обойти ограничение на макросы VBA, тогда, возможно, Excel не лучший инструмент для начала. Веб-страница с javascript может быть лучшим инструментом.



Степени матриц

Как написать макрос VBA, который использовал бы мощность матрицы (до произвольной указанной пользователем мощности), которая находится в ячейках от A1 до C3?


Принимая ваш вопрос буквально в математическом смысле, этот макрос увеличивает матрицу в степень (4 в примере), многократно вызывая MMULT в Excel. > функция.

  Dim i As LongDim pow As LongDim vIn As VariantDim vOut As Variantpow = 4 'или что-то еще' Извлечь матрицу из sheetvIn = Range ("A1: C3") 'Поднять до powervOut  = vInFor i = 1 To pow - 1 vOut = WorksheetFunction.MMult (vOut, vIn) Next i 'Записываем результат в sheetRange ("E1: G3") = vOut  

Я использовал функцию ниже. Обратите внимание, что, когда показатель степени равен 0, функция возвращает единичную матрицу, в противном случае матрица умножает на себя показатель степени количество раз.

  'Повышает матрицу до powerFunction PowerMatrixNew (rngInp As Range, lngPow As Integer) As Variant ()' создает идентификатор для power 0 Dim identity () As Variant ReDim identity (rngInp  .Rows.Count, rngInp.Rows.Count) Dim i As Integer Dim j As Integer For i = 1 To rngInp.Rows.Count For j = 1 To rngInp.Rows.Count If (i = j) Then identity (i,  j) = 1 Else identity (i, j) = 0 End If Next j Next i PowerMatrixNew = identity For i = 1 Для lngPow PowerMatrixNew = Application.WorksheetFunction.MMult (rngInp, PowerMatrixNew) Функция NextEnd  


Несколько лет назад был такой вопрос, который я помню, потому что он назывался матрицей арифметика, но не так, как меня учили в школе.

Заполните ячейки A1: C3 числами от 1 до 9. Установите для ячейки A5 значение 2. Выберите ячейки A7: C9 и введите

  = power (A1: C3, A5) ctrl + shift + enter  

и ячейки A7: C9 будет установлен в квадраты значений в A1: C3. Измените A5 на 3, и ячейки A7: C9 будут установлены в кубы значений в A1: C3.

Эквивалент в VBA:

  Диапазон ("a7: c9"). FormulaArray = "= Power (a1: c3, a5)"  

4

Оцените статью
clickpad.ru
Добавить комментарий