Массив множеств в Matlab - PullRequest
0 голосов
/ 19 марта 2020

Есть ли способ создать массив множеств в Matlab.

Например: у меня есть:

a = ones(10,1);
b = zeros(10,1);

Мне нужно c такое, что c = [(1 , 0); (1,0); ...], то есть каждый набор в c имеет первый элемент из a и 2-й элемент из b с соответствующим индексом.

Также есть какой-то способ проверить, существует ли неизвестный набор (x, y) находится в c.

Можете ли вы все, пожалуйста, помогите мне? Я Матлаб нуб. Спасибо!

Ответы [ 2 ]

3 голосов
/ 19 марта 2020

В вашем понимании в MATLAB нет наборов (я предполагаю, что вы думаете о кортежах на Python ...) Но есть ячейка s в MATLAB. Это тип данных, который может хранить практически все (вы можете подумать о указатель s, если вы знакомы с концепцией). На это указывает { }. Зная это, вы могли бы создать ячейку массивов и проверить их, используя cellfun

% create a cell of numeric arrays
C = {[1,0],[0,2],[99,-1]}
% check which input is equal to the array [1,0]
lg = cellfun(@(x)isequal(x,[1,0]),C)

Обратите внимание, что вы обращаетесь к адресу ячейки с () и к содержимому ячейки с {}. [] всегда указывает массивы чего-либо. Мы подошли к этому через мгновение.

Хорошо, это была та часть, о которой вы просили; теперь есть бонус :

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

% array of vectors (there is a way with less brackets but this way is clearer):
M = [[1;0],[0;2],[99;-1]]
% check at which column (direction ",1") all rows are equal to the proposed vector:
lg = all(M == [0;2],1)

Этот способ немного яснее, лучше с точки зрения памяти и быстрее. Обратите внимание, что обе переменные lg являются массивами логики. Вы можете использовать их непосредственно для индексации исходной переменной, то есть M(:,lg) и C{lg} возвращают набор , который вы ищете.

0 голосов
/ 19 марта 2020

Если вы хотите получить логическое значение, если p в C, возможно, вы можете попробовать код ниже

any(sum((C-p).^2,2)==0)

или

any(all(C-p==0,2))

Пример

C = [1,2;
     3,-1;
     1,1;
     -2,5];

p1 = [1,2];
p2 = [1,-2];

>> any(sum((C-p1).^2,2)==0) # indicating p1 is in C
ans = 1
>> any(sum((C-p2).^2,2)==0) # indicating p2 is not in C
ans = 0
>> any(all(C-p1==0,2))
ans = 1
>> any(all(C-p2==0,2))
ans = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...