2

私は 1x Nセルを持っています。それを と呼びますX。そのコンポーネントX{i}( i{1, 2, ..., N } の場合) は、文字列のM x1 セルまたはM x1 数値ベクトルのいずれかです。

注:テキスト セルと数値ベクトルの両方Xが含まれているため、ここでは使用できません。cell2mat

>> tmp = cell2mat(X);
Error using cell2mat (line 46)
All contents of the input cell array must be of the same data type.

私の質問は:

このデータをM 1x Nセルの配列に転置する MATLAB の「慣用的な」方法は何ですか?

EDIT:明確にするために、私が到達したいデータ構造は、それYを と呼びましょう 、1x N 個のセル(それぞれが数字と文字列の混合物で構成されています)のM長い配列です。たとえば、N =2 で、が文字列のM x1 セルで、が doubleのM x1 ベクトルである場合、望ましいデータ構造は、任意の 1 ≤ ≤ Mに対して、最初の要素がの- 番目の文字列で、2 番目の要素が の- 番目の double です。つまり、次のように定義された1x2セルと同じになります。X{1}X{2}YiY(i,:)iX{1}iX{2}Y(i,:)Yi

xi1 = X(i, 1);
xi2 = X(i, 2);
Yi = {xi1{1} xi2{1}};

(ぎこちなくてすみません! 中間変数andを作成せずに項andで直接の MATLAB 式を見つけることができません。)YiXixi1xi2

4

3 に答える 3

2

まず第一に、私の知る限り、Matlab でそれを行う「慣用的な」方法はありません。ネストされたセルと異なる型を持つ複雑なデータ構造について話していることを思い出してください。

cellfun に基づいてソリューションを作成しようとしました。それはすぐに複雑になり、私も成功しませんでした。代わりに、単純な double for ループと if を次のように実行することをお勧めします。

for a=1:size(X,2),
    for b=1:size(X{a},1),
        if iscell(X{a}),
            Y{a,b} = X{a}{b};
        else
            Y{a,b} = X{a}(b);
        end
    end
end

もしそうならX = {{'s1';'s2'} [3; 4]}、この解決策はY = {'s1' 3 ;'s2' 4}.

ご覧のとおり、セルを 1 つの深さまで平らにしました。1xNベクトルを取得するには、次のようにします。Y{1,:}

それが役に立てば幸い

于 2013-01-08T20:43:16.840 に答える
1

Xの各セルに同じサイズのベクトルが含まれている場合は、それを行列に変換し、その行列を転置してから、セル配列に変換し直しますか?

tmp = cell2mat(X);
Y = mat2cell(tmp', ...);
于 2013-01-08T18:21:54.827 に答える
1

関数は次のとおりです。

feval(@(y) feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), cellfun(@(x) feval(@(varargin) varargin{3-varargin{1}}(), iscell(x),x,num2cell(x)),y,'un',0)), {{'1','2','3'},[4 5 6],{7,8,9}})

または関数名として保存されます:

transpose_nest = @(cell_nest) feval(@(y) feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), cellfun(@(x) feval(@(varargin) varargin{3-varargin{1}}(),iscell(x),x,num2cell(x)),y,'un',0)), cell_nest);

transpose_nest({{'1','2','3'},[4 5 6],{7,8,9}})

{{'1',4,7},{'2',5,8},{'3',6,9}}

これは、サブセルでのみ機能する Scheme の (apply map list '(("1" "2" "3") (4 5 6) (7 8 9))) に相当する Matlab に基づいています。

feval(@(x) cellfun(@(varargin)[varargin],x{:},'un',0), {{'1','2','3'},{4,5,6},{7,8,9}})

{{'1',4,7},{'2',5,8},{'3',6,9}}

余分な部分:

@(x) feval(@(varargin) varargin{3-varargin{1}}(), iscell(x), x, num2cell(x))

サブ要素がベクトルの場合に num2cell を呼び出す無名関数内の if ステートメントです。

于 2013-07-11T20:23:37.337 に答える