1

例えば

test = struct('one', [1;2;3], 'two', [4;5;6]);

ベクトルを struct で垂直方向に連結したいと思いtestます。たとえば、代わりtest = {[1;2;3], [4;5;6]}にセル配列として定義されている場合は、次のことができますvertcat(test{:})。ただし、構造体の場合はオブジェクトをvertcat(test{:})返します。structtest

を使用して一時的なセル配列を作成する必要のないソリューションが必要struct2cellです。

4

2 に答える 2

5

あなたがしたいことは、実際に使用してからstruct2array結果を平坦化することです。

A = reshape(struct2array(test), [], 1);

%   1
%   2
%   3
%   4
%   5
%   6

基準

フォローアップとして、 と の使用法を比較するベンチマークを少し実行しstruct2cellましたstruct2arraycell2mat(struct2cell())1) セル配列で動作しており、2) 遅いことで有名な数値配列ではなくセル配列を使用しているため、このメソッドは遅くなると予想されます。テストの実行に使用したスクリプトは次のとおりです。

function tests()
    sizes = round(linspace(100, 100000));

    times1 = zeros(size(sizes));
    times2 = zeros(size(sizes));

    for k = 1:numel(sizes)
        sz = sizes(k);
        S = struct('one', rand(sz, 1), 'two', rand(sz, 1));
        times1(k) = timeit(@()cellbased(S));
        times2(k) = timeit(@()arraybased(S));
    end

    figure;
    plot(sizes, cat(1, times1 * 1000, times2 * 1000));
    legend('struct2cell', 'struct2array')
    xlabel('Number of elements in S.a and S.b')
    ylabel('Execution time (ms)')
end

function C = cellbased(S)
    C = cell2mat(struct2cell(S));
end

function C = arraybased(S)
    C = reshape(struct2array(S), [], 1);
end

そしてその結果 (R2015b)

ここに画像の説明を入力

于 2016-06-01T12:48:46.277 に答える
0

私の場合、次を使用してそれを行うことができました:

cell2mat(struct2cell(test))
于 2016-06-01T04:14:31.697 に答える