Угловые случаи, неожиданный и необычный [закрытый] MATLAB

@hash{@keys} = undef;

синтаксис здесь, где Вы обращаетесь к хешу с @, является частью хеша. Мы в основном говорим $hash{$keys[0]} И $hash{$keys[1]}, И $hash{$keys[2]}... список на левой стороне =, lvalue, и мы присваиваем тому списку, который на самом деле входит в хеш и устанавливает значения для всех именованных ключей. В этом случае я только определил одно значение, так, чтобы значение вошло $hash{$keys[0]}, и другие записи хеша, которые все автооживляют (оживают) с неопределенными значениями. [Мое исходное предложение здесь было установлено выражение = 1, который установит тот один ключ к 1 и другие к undef. Я изменил его для непротиворечивости, но как мы будем видеть ниже, точные значения не имеют значения.]

, Когда Вы понимаете, что lvalue, выражение на левой стороне =, является списком, созданным из хеша, тогда это начнет иметь некоторый смысл, почему мы используем это @. [Кроме я думаю, что это изменится в Perl 6.]

идея здесь состоит в том, что Вы используете хеш в качестве набора. То, что имеет значение, не является значением, которое я присваиваю; это - просто существование ключей. Таким образом, то, что Вы хотите сделать, не является чем-то как:

if ($hash{$key} == 1) # then key is in the hash

вместо этого:

if (exists $hash{$key}) # then key is in the set

на самом деле более эффективно просто работать exists проверка, чем обеспокоиться значением в хеше, хотя мне важной вещью здесь является просто понятие, что Вы представляете набор только с ключами хеша. Кроме того, кто-то указал, что при помощи [1 111] как значение здесь, мы используем меньше пространства памяти, чем мы были бы, присваивая значение. (И также генерируйте меньше беспорядка, поскольку значение не имеет значения, и мое решение присвоило бы значение только первому элементу в хеше и оставило бы другие undef, и некоторые другие решения поворачивают колеса телеги для создания массива значений для входа в хеш; полностью потраченное впустую усилие).

28
задан 15 revs, 3 users 100% 5 April 2012 в 14:31
поделиться

3 ответа

Вместо того, чтобы перечислять примеры странного синтаксиса MATLAB, я обращусь к некоторым примерам в вопросе, которые, на мой взгляд, имеют смысл или ожидаются / задокументированы / желательны.

  • Как ] ANY и ALL обрабатывают пустые аргументы:

    Результат any ([]) имеет смысл: во входном векторе нет ненулевых элементов (поскольку он пуст), поэтому он возвращает false.

    Результат all ([]) можно лучше понять, подумав о том, как вы могли бы реализовать свою собственную версию этой функции:

     function allAreTrue = my_all (inArray)
     allAreTrue = true;
     N = число (в массиве);
     index = 1;
     в то время как allAreTrue && (индекс <= N)
     allAreTrue = (inArray (индекс) ~ = 0);
     index = index + 1;
     конец
    конец
    

    Эта функция перебирает элементы inArray до тех пор, пока не встретит нулевой элемент. Если inArray пуст, цикл никогда не вводится и возвращается значение по умолчанию allAreTrue .

  • Объединение разных классов:

    При объединении разных типов в один массив MATLAB следует предустановленному приоритету классов и соответственно преобразует значения. Общий порядок приоритета (от наивысшего к низшему): char , целое число (любого знака или количества бит), одинарный , двойной и логический . Вот почему [double (1.8), uint8 (123)] дает результат типа uint8 . При объединении разных целочисленных типов ( uint8 , int32 и т. Д.), крайний левый матричный элемент определяет тип результата .

  • Несколько строк без использования оператора продолжения строки ( ... ) :

    При построении матрицы с несколькими строками вы можете просто нажать return после ввода одной строки и ввести следующую строку в следующей строке, без необходимости использовать точку с запятой для определения новой строки или . .. чтобы продолжить линию. Следовательно, следующие объявления эквивалентны:

     a = {'aa', 'bb' без необходимости использовать точку с запятой   для определения новой строки или  ...  чтобы продолжить линию. Следовательно, следующие объявления эквивалентны: 

     a = {'aa', 'bb' без необходимости использовать точку с запятой   для определения новой строки или  ...  чтобы продолжить линию. Следовательно, следующие объявления эквивалентны: 

     a = {'aa', 'bb'
    'cc', 'dd'};
    
    а = {'аа', 'bb'; ...
    'cc', 'dd'};
    
    а = {'аа', 'bb'; 'cc', 'dd'};
    

    Почему вы хотите, чтобы MATLAB вел себя так? Одна из причин, по которой я заметил, заключается в том, что это позволяет легко вырезать и вставлять данные, например, из документа Excel в переменную в командном окне MATLAB. Попробуйте следующее:

    • Выберите регион в файле Excel и скопируйте его.
    • Введите a = [ в MATLAB , не нажимая return .
    • Щелкните правой кнопкой мыши по окно команд MATLAB и выберите «Вставить».
    • Введите ]; и нажмите return. Теперь у вас есть переменная a , которая содержит данные из строк и столбцов, выбранных вами в файле Excel, и которая поддерживает «форму» данных.
8
ответ дан 28 November 2019 в 03:49
поделиться

Массивы против ячеек

Давайте для начала рассмотрим базовый синтаксис. Чтобы создать массив с элементами a , b , c , вы пишете [abc] . Чтобы создать ячейку с массивами A , B , C , вы пишете {ABC} . Пока все хорошо.

Доступ к элементам массива осуществляется следующим образом: arr (i) . Для ячеек это ячейка {i} . Все еще хорошо.

Теперь попробуем удалить элемент. Для массивов: arr (i) = [] . Экстраполируя приведенные выше примеры, вы можете попробовать cell {i} = {} для ячеек, но это синтаксическая ошибка . Правильный синтаксис для удаления элемента ячейки, по сути, тот же синтаксис, который вы используете для массивов: cell (i) = [] .

Итак, большую часть времени вы обращаетесь к ячейкам с использованием специального синтаксиса, но при удалении элементов вы используете синтаксис массива.

Если копнуть глубже, вы обнаружите, что на самом деле ячейка - это массив, в котором каждое значение имеет определенный тип. Таким образом, вы все еще можете записать cell (i) , вы просто получите обратно {A} (однозначная ячейка!). ячейка {i} - это сокращение для прямого извлечения A .

Все это не очень красиво, ИМО.

5
ответ дан 28 November 2019 в 03:49
поделиться

Координаты изображения и координаты графика Используется для получения меня каждый раз.

%# create an image with one white pixel
img = zeros(100);
img(25,65) = 1;

%# show the image
figure
imshow(img);

%# now circle the pixel. To be sure of the coordinate, let's run find
[x,y] = find(img);
hold on
%# plot a red circle...
plot(x,y,'or')
%# ... and it's not in the right place

%# plot a green circle with x,y switched, and it works
plot(y,x,'og')

Редактировать 1

Размеры массива

Переменные имеют как минимум два измерения. Скаляры имеют размер [1,1] , векторы имеют размер [1, n] или [n, 1] . Таким образом, ndims возвращает 2 для любого из них (на самом деле, ndims ([]) также равно 2, поскольку size ([]) равно [0,0] ). Это немного затрудняет проверку размерности вашего ввода. Чтобы проверить одномерные массивы, вы должны использовать isvector , 0D-массивы должны isscalar .

Редактировать 2

Назначение массивов

Обычно Matlab строг с назначениями массивов. Например,

m = magic(3);
m(1:2,1:3) = zeros(3,2);

выдает

??? Subscripted assignment dimension mismatch.

Однако эти действия работают:

m(1:2,1:2) = 1; %# scalar to vector
m(2,:) = ones(3,1); %# vector n-by-1 to vector 1-by-n (for newer Matlab versions)
m(:) = 1:9; %# vector to 'linearized array'

Edit 3

Логическая индексация с массивами неправильного размера Удачи в отладке!

Логическая индексация, кажется, вызывает find , поскольку вашему логическому массиву не нужно такое же количество элементов, как есть индексы!

>> m = magic(4); %# a 4-by-4 array
>> id = logical([1 1 0 1 0])
id =
     1     1     0     1     0
>> m(id,:)  %# id has five elements, m only four rows
ans =
    16     2     3    13
     5    11    10     8
     4    14    15     1
%# this wouldn't work if the last element of id was 1, btw

>> id = logical([1 1 0])
id =
     1     1     0
>> m(id,:) %# id has three elements, m has four rows
ans =
    16     2     3    13
     5    11    10     8
12
ответ дан 28 November 2019 в 03:49
поделиться
Другие вопросы по тегам:

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