4

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

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

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

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

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

Я огляделся вокруг, и до сих пор кажется, что ответ - нет.

2 ответа2

3

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

  • установите флажок: файл - параметры - формулы - "включить итеративные вычисления" (из версии 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 значений, для ее расчета необходимо изменить мощность, после чего лист будет "инициализирован", он будет работать без проблем.
  • проверка ошибок еще не реализована в формуле:
    • если power> максимальное количество итераций, то формула будет выполняться только при установленном времени итерации
    • аналогично, для нецелых или отрицательных чисел формула не останавливается, а выполняется до максимального числа итераций
    • после достижения максимального числа итераций формула будет "переполнена", отсчитывает вперед, не начиная с 0, чтобы исправить это, установите мощность, которая будет достигнута в следующем цикле итерации (например, если helper = 500, максимальное число итераций = 100, то установите 500 <power <600, чтобы формула там правильно остановилась и работала правильно для следующей настройки мощности).
  • Большинство проблем, описанных выше, могут быть исправлены в формуле, если это необходимо.

Обновить

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

1

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

Function PowerMatrix(Matrix As Range, Power As Long) As Variant
    Dim Result As Variant
    Dim Square As Variant
    Dim i As Long

    Square = Matrix

    For i = 0 To 31
        If (Power And 2 ^ i) Then
            If IsEmpty(Result) Then
                Result = Square
            Else
                Result = Application.WorksheetFunction.MMult(Square, Result)
            End If
        End If
        If 2 ^ i >= Power Then Exit For
        Square = Application.WorksheetFunction.MMult(Square, Square)
    Next
    PowerMatrix = Result
End Function

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .