Почему isscalar, isvector и ismatrix верны для A = 1?

Matlab имеет следующие функции для проверки входных данных:

  • isscalar, чтобы определить, является ли ввод скалярным.
  • isvector, чтобы определить, является ли ввод вектором
  • ismatrix, чтобы определить, является ли ввод матрицей

Для A = 1 (или любого "скалярного" ввода) все из приведенного выше возвращают true.
Почему я вижу это нелогичное поведение?
И как бы Я идентифицирую A = 1 как скаляр?


person Schorsch    schedule 29.08.2014    source источник


Ответы (2)


Я вообще не считаю это противоречащим здравому смыслу. В математике существуют векторы 1 измерения (хотя они и изоморфны скалярам). Также матрица вполне может иметь размер 1x1.

Это правда, что одно число можно считать скаляром, 1-вектором или матрицей 1x1. Представление Matlab:

  • Скаляр считается матрицей 1x1
  • n-вектор — это просто матрица 1 x n или n x 1.
  • В более общем смысле: конечные одноэлементные размеры не учитываются. Например, 3D-массив размером 2x3x4 также можно рассматривать, скажем, как 5D-массив размером 2x3x4x1x1. Это работает без ошибок:

    >> a = rand(2,3,4);
    >> a(2,2,2)
    ans =
        0.2575
    >> a(2,2,2,1,1)
    ans =
        0.2575
    

Теперь, если вы хотите проверить, является ли A вектором, матрицей или многомерным массивом с более чем одним элементом, используйте

numel(A)>1

Функция numel возвращает количество элементов своего входного аргумента.

person Luis Mendo    schedule 29.08.2014
comment
Кроме того, для пустых матриц только ismatrix возвращает true для []. Однако и ismatrix, и isvector возвращают true для пустого zeros(1,0) или транспонируют его. Это соответствует вашему ответу, то есть n может быть 0. - person horchler; 30.08.2014

Поскольку Matlab интерпретирует скаляры как массивы 1 на 1, см. size документация.


Поэтому, в зависимости от вашего приложения, вам придется

  • используйте isscalar, чтобы отличить вектор от скаляра (потому что он вернет false для вектора)
  • используйте isvector, чтобы отличить матрицу от вектора (потому что он вернет false для матрицы)

Потому что, если вы пытаетесь выяснить, является ли переменная вектором, а не скаляром, и вы используете isvector, и скаляр, и вектор вернут true - как указано в вопросе.

person Schorsch    schedule 29.08.2014