Ладно, мне было скучно, поэтому я выбрал извилистый маршрут.Он не отвечает на вопрос, поскольку это не «просто», но я делюсь этим, так как мне было весело.
Из определения wikipedia вы можете построить функцию, которая даст вам значениесимвола Cevi-Levita из индексов:
LC_value = @(v) round(prod(prod(triu(repmat(v,[numel(v) 1])-repmat(v',[1 numel(v)]),1) ...
./repmat(factorial([1:numel(v)]'),[1 numel(v)])+tril(ones(numel(v))))));
Это реализует общее n-мерное определение вложенного продукта.Будьте осторожны, функция факториала может привести к проблемам в больших размерах.Функция round
существует потому, что вы выполняете операции с плавающей запятой для генерации целых чисел.
Следующим шагом является применение этой функции ко всем возможным комбинациям индексов.Тем не менее, быстрее применить его только к перестановкам [1 2 3]
.
sites = perms([1 2 3]);
values = arrayfun(@(i)LC_value(sites(i,:)),(1:size(sites,1))');
lcMat = zeros(3,3,3);
lcMat(sub2ind(size(lcMat),sites(:,1),sites(:,2),sites(:,3))) = values;
Вот и все.Он работает для трех измерений, и он должен работать для более высоких измерений, хотя я не проверял это.