Как некоторые массивы и функции массива обрабатываются в Excel; в частности, зависимость обработки массива от вызывающей функции - PullRequest
0 голосов
/ 04 мая 2019

Пытаясь систематически перечислять возможности при броске четырех одинаковых, но загруженных четырехсторонних кубиков, я натолкнулся на необычное поведение Excel.Надеясь, что кто-то может пролить свет на то, что происходит под капотом.

В следующей таблице показаны возможные броски кубика:

1000 A

0100 B

0010 C

0001 D

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

При попытке отобразить все возможные комбинации четырех бросков такой матрицы -где комбинация кулаков может быть A + A + A + A или 4000, вторая может быть B + A + A + A или 3100 и т. д. для каждого из 4 ^ 4 = 256 вариантов - я решил, что хочусистематически смещать A на 0,1,2 или 3 строки для каждого из четырех бросков, а затем суммировать результаты.Другими словами, каждая возможная группа из 4 ролей может рассматриваться как 4 копии строки A, каждая из которых смещена на некоторое количество строк от 0 до 3, например {0; 0; 0; 0} или {1;0; 0; 0} в первом и втором случаях, перечисленных непосредственно выше.

Как ни странно, я получаю следующее.(все формулы являются формулами массива, введенными с помощью shift + ctrl + enter).

=TRANSPOSE(   SUM(   OFFSET(  A,  4x1ArrayOfRowOffsets,   0)))

отображает правильную сумму при вводе в диапазон 1x4.Аналогично, если =TRANSPOSE(...) заменено на =INDEX(...,1,1).Я так понимаю, потому что обе функции изначально поддерживают аргументы массива.Однако

=SUM(   OFFSET(  A,  4x1ArrayOfRowOffsets,   0))

не работает - кажется, что здесь суммирование проводится вдоль 4 строк, возвращаемых смещением, каждая из которых имеет значение 1 - неправильно отображает только значение 1, даже когдаоценивается в многоклеточном диапазоне как формула массива.Как ни странно,

=SUM(   TRANSPOSE(   OFFSET(  A,  4x1ArrayOfRowOffsets,   0)))

тоже не работает - транспонирование делает так, что суммирование выполняется правильно по столбцам, возвращаемым смещением, но, похоже, выбрасывает все, кроме первого столбца.

Обратите внимание, что, хотя в постановке задачи нет VBA, отсутствие аудита формул прозрачного массива в самом Excel (промежуточные шаги возвращают ошибки #VALUE, даже когда вычисляется окончательный ответ), вероятно, означает, что дляЧтобы исследовать эту проблему, кто-то должен будет написать немного VBA, которая вызывает функции листа и вручную выводит промежуточные вычисления.Вот почему я поставил версию этого вопроса здесь.

Переплетение вызовов INDEX где угодно, но внешний / первый вызов функции не решает проблему.

Чтобы попытаться увидеть, что происходитЯ исследовал дальше.

=INDEX(   OFFSET(   A,   {w;x;y;z},   0),   1,   {1,2,3,4})

правильно отображает четыре рулона, когда входит в диапазон 4x4.Как и прежде, w, x, y и z являются целыми числами от 0 до 3, указывающими смещения строк от «A» в таблице выше.Кроме того,

=COLUMNS(   OFFSET(   A,   {w;x;y;z},   0))

возвращает следующее при вводе в диапазон 5x5:

4   4   4   4   4

4   4   4   4   4

4   4   4   4   4

4   4   4   4   4

n/a n/a n/a n/a

Все, что можно сказать, вызов SUM(OFFSET(---)) с аргументами массива, кажется, производит различный вывод в зависимости отчто делает вызов - в частности, является ли вызывающая функция функцией, которая изначально принимает правильные аргументы массива.Почему это?Что здесь происходит на самом деле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...