Получение типа значения в APL

У меня есть длинный вектор, который должен быть вектором символов, но когда я распечатываю его с помощью функции DISPLAY Dyalog, он оказывается смешанным вектором. Теперь мне нужно выяснить, какой из элементов не является персонажем. Как мне получить тип значения в APL?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
190
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте ⎕DR (Data RR_1_RПредставительство), чтобы проверить тип вещей. Для char-vec это 82 (в 32-битном интерпретаторе) или 80 (64-битный), а поскольку 64-битная платформа поддерживает юникод, это также может быть 160 или 320. Вложенный вектор - 326.

NB:, вы также можете использовать ⎕DR¨, чтобы выяснить, какой элемент не соответствует вашим ожиданиям ...

Это помогло, спасибо! Как ни странно, для рассматриваемого вектора v ⎕DR¨ v возвращает вектор, в котором все элементы равны 82, несмотря на то, что v является смешанным вектором, а не вектором символов.

August Karlstrom 15.01.2019 11:00

Вполне может быть, что один из элементов вашего вектора сам является вектором (длины 1). Используйте ⍴¨, чтобы получить некоторое представление об этом ...

MBaas 15.01.2019 11:01

Я пробовал {⍬ ≡ ⍴⍵}¨ v, но он оценивает вектор, в котором все элементы равны 1. Если я не ошибаюсь, это означает, что ни один элемент не является вектором.

August Karlstrom 15.01.2019 11:13

Откуда взялся этот вектор? Если он был создан fn, может быть полезно увидеть код ..

MBaas 15.01.2019 11:16

Извините, с первого раза я не заметил обидного элемента. Выражение ({82 ≠ ⎕DR ⍵}¨ v) / ⍳⍴v дало мне позицию (282), которая содержит одноэлементный вектор с целым нулем.

August Karlstrom 15.01.2019 11:36

Хорошо, спасибо, что нашли это! Я был очень сбит с толку, когда вы сказали, что это все скаляры ;-)

MBaas 15.01.2019 11:37

Поправка: (({82 ≠ ⎕DR ⍵}¨ v) / ⍳⍴v) ⊃ v равен нулю.

August Karlstrom 15.01.2019 11:51

Кстати, если вы используете V17, вы можете использовать ⍸bool вместо bool/⍳⍴bool ;-)

MBaas 15.01.2019 14:22

@MBaas И вы тоже можете, если вы используете версию 16.0.

Adám 15.01.2019 14:34

Выражение * ⊃0⍴⊂A дает вам тип A. Тип массива - это, проще говоря, копия массива, но все содержимое рекурсивно заменяется нулями для чисел и пробелами для символов. Это означает, что вы можете сравнить тип с 0, чтобы найти числа.

Возьмем, к примеру, следующий вектор с несколько обманчивой формой отображения по умолчанию: Try it!

      ⊢v←'abc',1 2,'de 3 4',5
abc 1 2 de 3 4 5

Форма отображения в рамке не сообщает вам тип каждого элемента простого вектора; это только указывает на то, что массив имеет смешанный тип с + в нижнем левом углу: Try it!

      ]display v
┌→───────────────┐
│abc 1 2 de 3 4 5│
└+───────────────┘

Теперь находим тип: Try it!

      ⊢t←⊃0⍴⊂v
    0 0        0

Мы можем сложить его поверх исходного вектора, чтобы указать на числа: Try it!

      ↑t v
    0 0        0
abc 1 2 de 3 4 5

Или мы можем сравнить его с нулем, чтобы получить маску для чисел: Try it!

      ⊢m←0=t
0 0 0 1 1 0 0 0 0 0 0 1

Наконец, мы можем получить индексы, где ** есть числа: Try it!

      ⍸m
4 5 12

* If you are using ⎕ML←0, then ⊃0⍴⊂ can be written as the single primitive function
** If you are using version 15.0 or earlier you will have to write {(,⍵)/,⍳⍴⍵} instead of

Я на APL2. Наивно я бы пошел за

X≡¨⍕¨X

Числовые значения получают 1, а символьные значения - 0.

Нравится

Другие вопросы по теме