入力
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}
。
1つの方法は、使用することですcellfun
n=2
cellfun(@(x)(x{n}), hhh)
これは基本的に for ループの略です。
または、完全にベクトル化されている可能性がありますが、一般化がより困難になる別の方法は、最初に線形化してから、2 つおきの要素を選択することです。
temp = [hhh{:}]
[temp{2:2:end}]
Octave ではこれを 1 行で行うことができます (Matlab では残念ながらそうではありません)。
[hhh{:}](2:2:end)
セルの長さが等しいことが保証されている場合は、使用できます
cell2mat(vertcat(hhh{:}))*[0;1]
乗算では、配列をセルに積み重ねて作成された行列の 2 番目の列が選択されます。
編集:
一般的なケースでは、使用できます
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]
これで、2 番目の列の抽出は簡単になりました。
hhh(:,2)
行列を使用することは、データがすべて同じ長さではない (ただし、妥当な範囲内である) かどうかを検討する価値があります。これは、単純に、より効率的に格納され、非常に簡単に処理できるためです。次の例について考えてみてください。
hhh=[1, 11, 111; 2, 22, 222 ;3, 33, NaN; 4, 44, 444]
今でも同じくらい簡単です
hhh(:,2)