有没有一种方法可以在Matlab中创建集合数组。
例如:我有:
a = ones(10,1);
b = zeros(10,1);
我需要c,使得c=[(1,0(;(1,0;…],即c中的每个集合具有来自a的第一个元素和来自b的具有相应索引的第二个元素。
还有一种方法我可以检查未知集合(x,y(是否在c.中
你们能帮帮我吗?我是一个Matlab专家。谢谢
在MATLAB中,您的理解中没有集合(我假设您想到的是Python上的元组…(但在MATLAB中有单元格。这是一种几乎可以存储任何内容的数据类型(如果熟悉这个概念,您可能会想到pointers(。它是用{
}
来表示的。知道了这一点,你就可以想出一个阵列单元,并使用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)
请注意,您使用()
访问单元格的地址,使用{}
访问单元格的内容。[]
总是指示某个事物的数组。我们马上就到了。
好的,这是你要求的部分;现在有一个奖励:
你使用集合这个术语让我觉得它们总是有相同的大小。那么,为什么不创建一个数组(或者更好的是一个向量数组,它是一个矩阵(,并逐列检查这个矩阵呢?
% 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}
返回您要查找的集合。
如果您想获得关于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