在Matlab中比较一个单元格和一个向量
Comparing a cell with a vector in Matlab
我在 Matlab 中有一个维度 1x3
的单元格 A
,例如
A={{1,2,3,4} {5,6} {7,8,9} }
A
包含从 1
到 n
的所有整数,按升序排列。在示例中 n=9
。但是,每个子单元内的元素数量可以不同。每个子单元格都是非空的。
考虑维度 nx1
的向量 B
,其中包含一些从 1
到 n
的整数,按升序排列(允许重复),例如
B=[1 1 2 2 4 7 7 8 9]'
我想构造(不使用循环)维度 nx1
的向量 C
以便每个 C(i)
告诉 A
[=27] 的哪个子单元=] 属于。在例子中
C=[1 1 1 1 1 3 3 3 3]'
我不知道它是否比 for
循环快,但是
怎么样
C = arrayfun(@(b) find(cellfun(@(a) any(cell2mat(a) == b), A)), B);
解释:选取B
中的每个元素b
;然后选择 A
中的每个子单元 a
并检查与 b
是否相等,return 子单元的索引 b
是 b
的成员。
采用该结构,A
由其每个单元格的元素个数唯一确定,可以得到结果
C = sum(bsxfun(@gt, B, cumsum(cellfun(@numel, A))), 2)+1;
我在 Matlab 中有一个维度 1x3
的单元格 A
,例如
A={{1,2,3,4} {5,6} {7,8,9} }
A
包含从 1
到 n
的所有整数,按升序排列。在示例中 n=9
。但是,每个子单元内的元素数量可以不同。每个子单元格都是非空的。
考虑维度 nx1
的向量 B
,其中包含一些从 1
到 n
的整数,按升序排列(允许重复),例如
B=[1 1 2 2 4 7 7 8 9]'
我想构造(不使用循环)维度 nx1
的向量 C
以便每个 C(i)
告诉 A
[=27] 的哪个子单元=] 属于。在例子中
C=[1 1 1 1 1 3 3 3 3]'
我不知道它是否比 for
循环快,但是
C = arrayfun(@(b) find(cellfun(@(a) any(cell2mat(a) == b), A)), B);
解释:选取B
中的每个元素b
;然后选择 A
中的每个子单元 a
并检查与 b
是否相等,return 子单元的索引 b
是 b
的成员。
采用该结构,A
由其每个单元格的元素个数唯一确定,可以得到结果
C = sum(bsxfun(@gt, B, cumsum(cellfun(@numel, A))), 2)+1;