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 ]機能します)。私はすでにこれを包囲ループで行う必要があるため、不要な計算は避けたいと思います...

同じトピックで: 1 つのスタックのすべてのデータを同じタイムスタンプで取得することは可能ですか? このようなもの:

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

ご協力いただきありがとうございます!

4

3 に答える 3

1

どうですか

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

2番目の質問については、次のようなことができます

allTimes = [a.Time];
allDataX(allTimes == 5)
于 2013-05-22T12:59:09.353 に答える
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,:)

cell 配列には、さまざまな座標セットを格納できます。

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 に答える