连接结构元素
Concatenating structure elements
例如
test = struct('one', [1;2;3], 'two', [4;5;6]);
我想垂直连接结构 test
中的向量。例如,如果它被定义为元胞数组而不是 test = {[1;2;3], [4;5;6]}
,我可以做 vertcat(test{:})
。但是,如果 test
是结构,vertcat(test{:})
returns 一个 struct
对象。
我想要一个不涉及使用 struct2cell
创建临时元胞数组的解决方案。
在我的例子中,我设法做到了:
cell2mat(struct2cell(test))
你要做的是实际使用struct2array
,然后将结果展平。
A = reshape(struct2array(test), [], 1);
% 1
% 2
% 3
% 4
% 5
% 6
基准
作为后续行动,我执行了一些基准测试,比较了 struct2cell
和 struct2array
的用法。我们预计 cell2mat(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)
例如
test = struct('one', [1;2;3], 'two', [4;5;6]);
我想垂直连接结构 test
中的向量。例如,如果它被定义为元胞数组而不是 test = {[1;2;3], [4;5;6]}
,我可以做 vertcat(test{:})
。但是,如果 test
是结构,vertcat(test{:})
returns 一个 struct
对象。
我想要一个不涉及使用 struct2cell
创建临时元胞数组的解决方案。
在我的例子中,我设法做到了:
cell2mat(struct2cell(test))
你要做的是实际使用struct2array
,然后将结果展平。
A = reshape(struct2array(test), [], 1);
% 1
% 2
% 3
% 4
% 5
% 6
基准
作为后续行动,我执行了一些基准测试,比较了 struct2cell
和 struct2array
的用法。我们预计 cell2mat(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)