Matlab中的集合数组



有没有一种方法可以在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

相关内容

  • 没有找到相关文章

最新更新