Extracting data fom nested object arrays

1 回表示 (過去 30 日間)
Sigurd Askeland
Sigurd Askeland 2018 年 4 月 24 日
編集済み: Matt J 2018 年 4 月 24 日
I have object arrays where the objects have properties that them-self are object arrays. What is the best way to extract data from the "bottom layer"?
A single data point can be accessed in this way:
dataIwant(3,2) = topLayer(3).middleLayerProperty(2).bottomLayerProperty;
  1. Is there a one-liner for creating the entire dataIwant?
  2. Why is this so slow?
dataIwant = [topLayer.middleLayerProperty];
dataIwant = [dataIwant.bottomLayerProperty];
It took more than 0.015s for a 600 (top layer) x 4 (middle layer) object array.

採用された回答

Matt J
Matt J 2018 年 4 月 24 日
Is there a one-liner for creating the entire dataIwant?
Not using out-of-the-box MATLAB features, but you can overload the subsref method of the class to have any behavior that you want.
Why is this so slow?
It depends on many factors, such as the memory consumed by the array, your MATLAB version, whether you executed this from the command line or inside a function, whether you ran this once or many times (so that the commands could cache).
But the statements you've shown are not trivial operations. They build whole new arrays, and so require memory allocation and copying. You should consider whether splitting your middle layer across many objects is really the best data organization for you. It might be better to have a single object with an array of middle-layer objects, so that you can index like this
dataIwant(3,2) = topLayer.middleLayerProperty(3,2).bottomLayerProperty;
  2 件のコメント
Sigurd Askeland
Sigurd Askeland 2018 年 4 月 24 日

Thanks!

Why is this so slow?

I improved the speed three-fold by making the objects inherit handle. (That may come back to bite me...) That would indicate that memory allocation and copying was the problem. It is still as slow as a for loop, though.

Is there a one-liner ...

I would love for there to be at least this kind of functionality:

    dataIwant(:,2) = [topLayer.middleLayerProperty(2).bottomLayerProperty];

Can that be done by overloading the subsref method?

Matt J
Matt J 2018 年 4 月 24 日
編集済み: Matt J 2018 年 4 月 24 日

The indexing syntax is totally in your control when you overload subsref. Be mindful, though, that once you do, you will also have to supply definitions of dot-indexing statements, e.g.,

   toplayer.property

to have this syntax outside the classdef file.

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeCustomize Object Indexing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by