输入
hhh={{1,11},{2,22},{3,33},{4,44}}
预期输出
11 22 33 44
Ps hhh{1}{2}
, hhh{2}{2}
,hhh{3}{2}
并hhh{4}{2}
返回正确的输出,但我试图找到如何做到这一点hhh{:}{2}
。
输入
hhh={{1,11},{2,22},{3,33},{4,44}}
预期输出
11 22 33 44
Ps hhh{1}{2}
, hhh{2}{2}
,hhh{3}{2}
并hhh{4}{2}
返回正确的输出,但我试图找到如何做到这一点hhh{:}{2}
。
一种方法是使用cellfun
n=2
cellfun(@(x)(x{n}), hhh)
这本质上只是 for 循环的简写。
或者另一种可能是完全矢量化但更难以概括的方法是首先线性化然后选择每个第二个元素:
temp = [hhh{:}]
[temp{2:2:end}]
Octave 在一行中允许这样做(不幸的是,Matlab 没有):
[hhh{:}](2:2:end)
如果保证单元格具有相同的长度,您可以使用
cell2mat(vertcat(hhh{:}))*[0;1]
乘法选择通过将数组堆叠在单元格中创建的矩阵的第二列。
编辑:
对于一般情况,您可以使用
n=2;
result = cell2mat(vertcat(hhh{:}))*sparse(n,1,1,size(hhh{1},2),1);
或者
temp = cell2mat(vertcat(hhh{:}));
result = temp(:,2);
如果您的数组保证为正方形和数字,您应该认真考虑改用矩阵。
例如:
hhh=[1, 11; 2, 22 ;3, 33; 4, 44]
现在提取第二列变得微不足道:
hhh(:,2)
如果数据的长度不是全部相等(但在合理的变化范围内),使用矩阵甚至值得考虑,因为它存储效率更高并且处理起来也很容易。想想这个例子:
hhh=[1, 11, 111; 2, 22, 222 ;3, 33, NaN; 4, 44, 444]
现在它仍然像
hhh(:,2)