Покажите дубликаты в Mathematica

Когда Вы проектируете от 3D до 2D, Вы теряете информацию.

В простом случае единственной точки обратная проекция дала бы Вам бесконечный луч через 3-е пространство.

Стереоскопическая реконструкция будет обычно запускаться с двух 2-х изображений и проекта оба назад к 3D. Тогда ищите пересечение двух 3D произведенных лучей.

Проекция может принять различные формы. Ортогональный или перспектива. Я предполагаю, что Вы принимаете ортогональную проекцию?

В Вашем случае, принимающем Вас, имел исходную матрицу, у Вас будет 4 луча в 3D пространстве. Вы тогда были бы в состоянии ограничить проблему своими 3-ми прямоугольными размерами и попытаться решить.

решение не будет уникально как вращение вокруг ни одной оси, которая параллельна 2-й плоскости проекции, будет неоднозначно в направлении. Другими словами, если 2-е изображение перпендикулярно оси z, тогда поворачивающей 3-й прямоугольник по часовой стрелке, или анти-по часовой стрелке вокруг оси X произвел бы то же изображение. Аналогично для оси y.

В случае, где прямоугольная плоскость параллельна оси z, у Вас есть еще больше решений.

, Поскольку у Вас нет исходной матрицы проекции, дальнейшая неоднозначность представлена arbitary масштабным коэффициентом, который существует в любой проекции. Вы не можете различать масштабирование в проекции и перевод в 3-м в направлении оси z. Это не проблема, если Вы только интересуетесь относительными положениями 4 точек в 3-м пространстве, когда связано друг с другом а не с плоскостью 2-й проекции.

В перспективной проекции вещи становятся более твердыми...

12
задан Martin Janiczek 27 October 2009 в 14:11
поделиться

4 ответа

Множество способов выполнить извлечение списка, как это; вот первое, что пришло мне в голову:

Part[Select[Tally@x, Part[#, 2] > 1 &], All, 1]

Или, более читабельно, по частям:

Tally@x
Select[%, Part[#, 2] > 1 &]
Part[%, All, 1]

, что соответственно дает

{{1, 1}, {2, 1}, {3, 2}, {4, 1}, {5, 2}, {6, 1}}
{{3, 2}, {5, 2}}
{3, 5}

Возможно, вы можете придумать более эффективный (во времени или пространстве кода) способ :)

Кстати, если список не отсортирован, вам нужно сначала запустить Sort , прежде чем это сработает.

11
ответ дан 2 December 2019 в 05:41
поделиться

Использование решения типа dreeves, но только возврат один экземпляр каждого дублированного элемента - это немного сложнее. Один из способов сделать это:

collectDups1[l_] :=
  Module[{i, j},
    i[n_] := (i[n] := j[n]; Unevaluated@Sequence[]);
    j[n_] := (j[n] = Unevaluated@Sequence[]; n);
    i /@ l];

Это не совсем соответствует выходным данным решения Уилла Робертсона (превосходное ИМО), потому что элементы появятся в возвращаемом списке в том порядке, в котором можно определить, что они дубликаты. Я не уверен, что это действительно можно сделать за один проход, все способы, которые я могу придумать, включают, по сути, как минимум два прохода, хотя один может быть только над дублированными элементами.

3
ответ дан 2 December 2019 в 05:41
поделиться

Учитывая список A,
получить неповторяющиеся значения в B
B = Удалить дубликаты [A]
получить повторяющиеся значения в C
C = Дополнение [A, B]
получить не повторяющиеся значения из списка дубликатов в D
D = DeleteDuplicates [C]

Так, например,
A = 1, 2, 2, 2, 3, 4, 4
B = 1, 2, 3, 4
C = 2, 2, 4
D = 2, 4

, поэтому вашим ответом будет DeleteDuplicates [Complement [x, DeleteDuplicates [x]]], где x - ваш список. Я не разбираюсь в математике, поэтому синтаксис здесь может быть идеальным, а может и не быть. Просто просматриваю документы на странице, на которую вы ссылаетесь.

0
ответ дан 2 December 2019 в 05:41
поделиться

Ваш ответ находится в этом обзоре . BIGINT действительно составляет 8 байтов. Только TinyInt 1.

Между прочим, я не считаю диапазон от -9223372036854775808 до 9223372036854775807 очень смущающим, это +/- 2 ^ 63:).

но я думаю, что если вы хотите получить больше скорости, это должно победить. Но если бы вас это волновало, вы бы не программировали в Mathematica! :)

6
ответ дан 2 December 2019 в 05:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: