Защо isscalar, isvector и ismatrix са верни за A = 1?

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

  • isscalar, за да определите дали въвеждането е скаларно
  • isvector, за да определите дали входът е вектор
  • ismatrix, за да определите дали входът е матрица

За A = 1 (или всеки „скаларен“ вход) всички от горните връщат true.
Защо виждам това противоречащо на интуицията поведение?
И как би Определям A = 1 като скаларен?


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


Отговори (2)


Изобщо не го намирам за контраинтуитивно. В математиката съществуват вектори с едно измерение (въпреки че са изоморфни на скалари). Освен това една матрица може идеално да има размер 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