1

次のコードがあります

o = ones(4,3,2)
c = cellfun(@squeeze,num2cell(o,[2 3]), 'UniformOutput', false)

これにより、予想どおり、それぞれが 3x2 の行列を含む 4 つのセルが得られます。

しかし、o の最後の次元を 1 に減らすと、動作はまったく期待どおりになりません。

o = ones(4,3,1)
c = cellfun(@squeeze,num2cell(o,[2 3]), 'UniformOutput', false)

出力は次のとおりです。

[1x3 double]
[1x3 double]
[1x3 double]
[1x3 double]

私が期待するのに対し:

[3x1 double]
[3x1 double]
[3x1 double]
[3x1 double]

正しい結果を得る方法はありますか?

4

1 に答える 1

3

の次元が のとき、oベクトルを4 x 3 x 1与えるnum2cell(o, [2 3])ドキュメント1 x 3記載されているように、 は 2D 配列には影響しないため、行ベクトルまたは列ベクトルのままになります。squeeze

二次元配列はスクイーズによる影響を受けません。がA行ベクトル、列ベクトル、またはスカラー (1 行 1 列) 値の場合、B = A.

size(squeeze(rand(1, 3)))
%   1   3

size(squeeze(rand(3, 1)))
%   3   1

@Luisで指摘されているように、期待する寸法を取得するために にsqueeze置き換えることができます。permute

c = cellfun(@(x)permute(x, [2 3 1]), num2cell(o,[2 3]), 'UniformOutput', false)
于 2016-09-19T15:53:03.597 に答える