2010-11-02 4 views
3

У меня есть функция, которая преобразует список 1D в 3D список, но в то же самое время, когда 2-го и 3-го измерения индексы равны помещают нули вместо значений из списка ввода:Преобразования 1D список 3D список

n = 4 

input = Table[RandomInteger[5], {i, 1, 48}] 

convert[l_] := Table[If[i == j, 0, l[[index++]]], {s, 1, 4}, {i, 1, n}, {j, 1, n}] 

output = convert[input] 

Я хотел бы избавиться от функции Increment [] (++).

+0

Как 'n' определено в' Table' итераторы? – rcollyer

+0

@rcollyer Я добавил n задание на мой вопрос – Max

+1

Также рассмотрите решение, данное в http://stackoverflow.com/q/3807976/421225 – Simon

ответ

1

Я думаю, что это может работать:

convert[l_] := Insert[Partition[Partition[l, 3], 4], 0, 
         Flatten[Table[{j, i, i}, {j, 4}, {i, 4}], 1]] 

Возможно, кто-то более здравый смысл может помочь избавиться от раздела [Partition противного строительства.

HTH!

+2

К сожалению, еще нет замены для использования вложенных вызовов 'Partition' (см. [«Обратное сглаживание в математике»] (http://stackoverflow.com/questions/3807976/inverse-of-flatten-in-mathematica/3808284) для общего решения, по крайней мере) –

+1

Кроме того, я предлагаю 'ReplacePart [..., {_, i_, i _} -> 0] 'вместо' Insert', вам не нужно создавать список спецификаций деталей, но вместо этого можно использовать простой шаблон. –

+0

@Michael Спасибо за указатель. На меня, я проголосовал за ваш ответ ... и забыл об этом. Что касается предложения ReplacePart [], я не нашел его элегантный способ. Пожалуйста, не стесняйтесь отредактировать мой ответ или написать еще один (Вставка действительно неуклюжая) –

1

Вот альтернатива (аb) с использованием SparseArray, но это не исключает необходимость индексной переменной и приращения:

convert[l_] := Module[{q=1}, 
    Normal[SparseArray[{{_,i_,i_} -> 0, {i_,j_,k_} :> l[[q++]]}, {3, 4, 4}]] 
] 
Смежные вопросы