Многомерный массив против списка кортежей списка - PullRequest
7 голосов
/ 22 июня 2011

Я пишу некоторый код, чтобы выполнить некоторые симуляции теории игр.В моем «мире» есть несколько состояний (скажем, 2 в моем случае), в нем также есть несколько игроков (опять же, 2), и у каждого игрока есть матрица выплат (2 на 2).

Я пытался создатьследующий многомерный массив в R:

U = array(2,2,2,2)
U[1][1] = cbind(c(0.7,0.3),c(0.3,0.7))

и я получаю следующую ошибку:

number of items to replace is not a multiple of replacement length

Я могу перейти к использованию списка, в котором каждый элемент будет спискомдва элемента, A и B, где A и B - матрицы 2x2.Тем не менее, я думаю, что выполнение операций над списками будет медленно раздражать, и векторизация будет трудной.

Есть предложение относительно правильной реализации или объяснение того, почему вышеприведенный код не работает?

Обновление: по-видимому, правильный синтаксис будет:

U[1,1, , ] = cbind(c(0.7,0.3),c(0.3,0.7))

Мой вопрос остается в силе - что лучше, многомерные векторы или список кортежей?

  • Рон

1 Ответ

11 голосов
/ 22 июня 2011

Этот код не может работать, и вы должны хотя бы попробовать его сами:

array(2,2,2,2)  ## results in unused argument error

Я думаю, вы хотите 4D массив

U <- array(0, dim = c(2,2,2,2))

, а затем для присвоения 2D части используйте R's? Синтаксис

U[1,1,,] <- cbind(c(0.7,0.3),c(0.3,0.7))

Код U[1][1] можно понять с точки зрения того, что U обрабатывается так, как если бы он был вектором без атрибута "dim" (только числа в векторе, без размерной структуры). Первый [1] извлекает первый элемент, возвращая вектор одного элемента, а второй [1], в свою очередь, избыточно извлекает первый элемент из этого вектора одного элемента.

С точки зрения понимания, что такое U[1,1,,]: это двумерная матрица, которая является подмножеством массива 4D U, определяемая путем взятия первого среза из первого и второго измерений и каждого среза из третьего и четвертое измерение.

Ошибка, которую вы видите, связана с тем, что вы пытаетесь присвоить 2D-матрицу одному элементу U - но есть только один слот, а структура и размер первого элемента отличаются от матрицы, которой вы являетесь пытаясь раздавить его.

Синглтонные измерения (первое и второе), которые имеют только один срез из извлеченного подмножества, удаляются (по умолчанию) из результата. Этого можно избежать, указав:

U[1, 1, , , drop = FALSE]

, который дал бы массив 4D, но один с двумя «вырожденными» измерениями, т.е. [1, 1, 2, 2], где первые два вида избыточны (но смысл этого действительно зависит от вашей цели). Эта часть на самом деле не имеет отношения к проблеме присвоения новых значений подмножеству исходного массива, но может помочь вашему пониманию.

Подойдет ли вам массив или список, зависит от того, что вы хотели бы сделать, поэтому я бы порекомендовал повторно задать ваш вопрос и сосредоточиться на этих потребностях.

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