我有一个单元格数组 A [1x80],其中每个元素本身就是一个单元格数组 [9x2]。我还有一个向量 B 代表 A 的一组选定单元格,我想提取每个选定单元格的元素 {2,2}。
我尝试了一个简单的
A(1,B){2,2}
但当然它不起作用....你能帮帮我吗?
我有一个单元格数组 A [1x80],其中每个元素本身就是一个单元格数组 [9x2]。我还有一个向量 B 代表 A 的一组选定单元格,我想提取每个选定单元格的元素 {2,2}。
我尝试了一个简单的
A(1,B){2,2}
但当然它不起作用....你能帮帮我吗?
这个怎么样:
A = {{1 2; 3 4}, {5 6;7 8}, {9 0; 1 2}; {3 4; 5 6}, {7 8; 9 0}, {11 22; 33 44}};
B = [2,3]
[cellfun(@(x)x(2,2), A){1, B}]
ans =
8 2
编辑:
以上实际上仅适用于八度音阶。正如@Amro 指出的那样,要修改它以在 Matlab 中工作,您需要使用一个临时变量:
temp = cellfun(@(x)x(2,2), A);
[temp{1, B}]
或者在一个班轮中(也感谢@Amro)
cellfun(@(c)c{2,2}, A(1,B))
这个答案与@Dan 的答案相同,但如果需要,可以使用简单的 for 循环来提高性能。
% If you know that the numel of elements returned by {2,2} will always be one:
nElem = numel(B);
ret(1,nElem)=0;
for k=1:nElem
ret(k) = A{1,B(k)}{2,2}
end
以下答案是错误的,它只会从 B 的第一个元素返回 {2,2} 索引
subsref([A{1,B}],struct('type','{}','subs',{{2,2}}))
这听起来更像您正在做的事情(并且不使用cellfun
and arrayfun
,如果您在循环上执行此操作会更好,因为它们很慢)
请参阅此处subsref
的文档。
更长的路径是:
temp = [A{1,B}]
temp{2,2}
或者(感谢@Amro)怎么样?arrayfun(@(x) A{1,x}{2,2}, B)
cellfun(@(c)c{2,2}, A(1,B))