4

我有一个包含数据的堆叠结构,看起来像这样:

a(1) = struct('X',rand(10,1),'Y',rand(10,1),'Time',(1:1:10)')
a(2) = struct('X',rand(10,1),'Y',rand(10,1),'Time',(1:1:10)')

(堆叠结构的数量和每个参数的长度不是恒定的)

现在我想使用时间戳 5 访问所有 X 数据。我知道我可以通过循环来做到这一点:

data = zeros(length(a),1)
for k=1:1:length(a)
    data(k) = a(k).X(5)
end

但我想知道是否没有办法在没有循环的情况下访问数据?

我试过b = [ a(:).X(5) ]了,但这不起作用(b = [ a(:).X ]确实)。我已经必须在一个环绕循环中执行此操作,所以我想避免不必要的计算......

并且在同一主题中:是否可以使用相同的时间戳获取一个堆栈的所有数据?像这样的东西:

data = a(1)(a(1).Time==5)
>> data
data =
     <X value>    <Y value>    5

谢谢你的帮助!

4

3 回答 3

4

这正是getfield它的用途!

data = getfield( a, {1:numel(a)}, 'X', {5} );
于 2013-05-22T14:32:03.250 回答
1

一个班轮解决方案

等效于[a(:).X(5)],您可以使用subsref()来执行[a.X](5,:)

subsref([a.X], substruct('()',{5,':'}))

同样,a(1)(a(1).Time == 5)可以使用[a(1).X a(1).Y a(1).Time](a(1).Time == 5,:)

subsref(cell2mat(struct2cell(a(1))'), substruct('()',{a(1).Time == 5,':'}))
ans =
    0.6324    0.8003    5.0000

更好的方法

我假设每个时间戳都有一对坐标,这意味着您可以将结构存储为:

data = [a(1).X a(1).Y a(1).Time];

这将使索引更容易:

data(:,5)
data(data(:,3)==5,:)

您可以在元胞数组中存储不同的坐标集:

data = {[a(1).X a(1).Y a(1).Time]
        [a(2).X a(2).Y a(2).Time]
        ...};

data{1}(:,5)
data{1}(data{1}(:,3)==5,:)
于 2013-05-22T13:08:56.293 回答
1

怎么样

allDataX = [a(:).X];
allDataX(5, :) % the fifth row of all the Xs

至于你的第二个问题,你可以做这样的事情

allTimes = [a.Time];
allDataX(allTimes == 5)
于 2013-05-22T12:59:09.353 回答