Nano Hash - криптовалюты, майнинг, программирование

Использование функции поиска Matlab для получения индекса вершины по ее координатам

У меня есть матрица 50943x3, содержащая вершины поверхностной сетки. Я хочу найти индекс определенной вершины, используя ее координаты (x, y, z).

Я попробовал найти функцию Matlab, но она возвращает пустую матрицу 0 на 1.

Заранее спасибо,

Ваше здоровье


  • Вы должны опубликовать свой код, чтобы показать, что было предпринято 19.11.2018

Ответы:


1

Ваша попытка, вероятно, не работает из-за ошибок округления с плавающей запятой. Подробнее об этом можно прочитать здесь. Вы можете изучить функцию eps или просто использовать этот пример :

% Your matrix
M = randn(50943 , 3);

% The coordinates you are looking for
P = [0,0,0];

% Distance between all coordinates and target point
D = sqrt(sum((M - bsxfun(@minus,M,P)).^2,2));

% Closest coordinates to target
[~ , pos] = min(D);

% Display result
disp(M(pos , :))
19.11.2018
  • pos = find(D<tol);, где tol — подходящий допуск, также подойдет вместо [~ , pos] = min(D);. Он успешно вернет 2 индекса, если есть две совпадающие точки, и пустой массив, если их нет, в то время как min всегда будет возвращать один индекс. Это зависит от того, можно ли ожидать этих случаев или нет, и что следует делать в этом случае. 19.11.2018
  • Я использовал именно этот пример, чтобы понять его, но он возвращает ошибку «Размеры матрицы должны быть согласованы» в строке D = sqrt(sum((M - P).^2,2)); 19.11.2018
  • @amine Вероятно, вопрос в версии Matlab; Я исправил пример, чтобы сделать его совместимым со старыми версиями, которые не расширяют матрицы автоматически. 19.11.2018
  • @Brice, OP хочет найти индекс определенной вершины по ее координатам, а не все вершины, близкие к данной точке. Я думаю, что решение должно возвращать только одну точку! В противном случае да, ваша модификация будет работать. 19.11.2018
  • @Zep, чтобы быть придирчивым, чтобы обеспечить совместимость с версиями Matlab до R2016b, рекомендуется заменить (M-P) на bsxfun(@minus,M,P), а не использовать repmat. Производительность лучше, а код короче. И обратно совместим до версии R2007a. 19.11.2018

  • 2

    Попробуйте следующее:

    mat = randi(30,50943,3);
    vec = [1,2,3];
    % R2106b+ code
    ind = find(all(mat==vec,2));
    % or: explicit expansion, works with all versions
    ind = find(all(bsxfun(@eq,mat,vec),2));
    

    Что он делает: == или eq проверяет, равны ли координаты (дает логическую матрицу [50943x3]) all возвращает true, только если все координаты равны find возвращает индекс всех ненулевых элементов

    Это работает только для точного совпадения (отсюда целочисленные координаты, выбранные с помощью randi).


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

    [min_dist,ind_nearest] = min(sum(bsxfun(@minus,mat,vec).^2,2)); % index to the nearest point
    
    19.11.2018
  • Большое спасибо, это работает. Теперь, если vec не существует в матрице mat, как получить ближайшую вершину? 19.11.2018
  • Если вы хотите ближайшее, то используйте ответ от @Zep, вычисляя расстояние и ища минимум. Это предложение будет работать только при точном совпадении (отсюда и пример с randi и целочисленными координатами) 19.11.2018
  • Да, это работает, спасибо за два предложения, я буду иметь это в виду. 19.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..