@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
, и некоторые другие решения поворачивают колеса телеги для создания массива значений для входа в хеш; полностью потраченное впустую усилие).
Вместо того, чтобы перечислять примеры странного синтаксиса 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, и которая поддерживает «форму» данных.
Массивы против ячеек
Давайте для начала рассмотрим базовый синтаксис. Чтобы создать массив с элементами a , b , c , вы пишете [abc]
. Чтобы создать ячейку с массивами A , B , C , вы пишете {ABC}
. Пока все хорошо.
Доступ к элементам массива осуществляется следующим образом: arr (i)
. Для ячеек это ячейка {i}
. Все еще хорошо.
Теперь попробуем удалить элемент. Для массивов: arr (i) = []
. Экстраполируя приведенные выше примеры, вы можете попробовать cell {i} = {}
для ячеек, но это синтаксическая ошибка . Правильный синтаксис для удаления элемента ячейки, по сути, тот же синтаксис, который вы используете для массивов: cell (i) = []
.
Итак, большую часть времени вы обращаетесь к ячейкам с использованием специального синтаксиса, но при удалении элементов вы используете синтаксис массива.
Если копнуть глубже, вы обнаружите, что на самом деле ячейка - это массив, в котором каждое значение имеет определенный тип. Таким образом, вы все еще можете записать cell (i)
, вы просто получите обратно {A}
(однозначная ячейка!). ячейка {i}
- это сокращение для прямого извлечения A
.
Все это не очень красиво, ИМО.
Координаты изображения и координаты графика Используется для получения меня каждый раз.
%# 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