2

構造体の最大値を見つけようとしていますが、うまくいきmax([tracks(:).matrix])ません。次のエラーが表示されます。アイデアはありますか?

私の構造体は次のようになります。

tracks = 

1x110470 struct array with fields:
    nPoints
    matrix

track.matrix には 3D ポイントが含まれています。たとえば、ここに

tracks(1,2).matrix:

33.727467   96.522331   27.964357
31.765503   95.983849   28.984663
30.677082   95.989578   29
4

3 に答える 3

4

これを行うには、配列 fun を使用し、その後に別の max を使用できます。

s.x = [1 3 4];
s(2).x = [9 8];
s(3).x = [1];

maxVals = arrayfun(@(struct)max(struct.x(:)),s);

maxMaxVals = max(maxVals(:));

または、MAX の後に .x のサイズを保持したい場合:

s.x = [1 3 4];
s(2).x = [9 8 3];
s(3).x = [1 2 2; 3 2 3];

maxVals = arrayfun(@(struct)max(struct.x,[],1),s,'uniformoutput',false);

maxMaxVals = max(cat(1,maxVals{:}))

または、すべてが nx 3 であることがわかっている場合

s.x = [1 3 4];
s(2).x = [9 8 3];
s(3).x = [1 2 2; 3 2 3];
matrix = cat(1,s.x)
maxVals = max(matrix)
于 2012-11-27T01:10:53.063 に答える
2

あなたが最大値を見つけようとしていることはわかりませんが、これを行うことができます:

matrixConcat = [tracs.matrix]

これにより、すべての行列の大きな連結リストが得られます。次に、その上で max を実行して、最大値を見つけることができます。

これがあなたが探していたものかどうか教えてください。そうでなければ、答えを変更します。

于 2012-11-27T00:35:22.677 に答える
1

[]すべてのサイズが異なるため使用できませんtracks.matrix。したがって、連結は失敗します。

ただし、セルに連結するために使用できます。{}

% example structure
t = struct(...
    'matrix', cellfun(@(x)rand( randi([1 5])), cell(1, 30), 'uni', 0))


% find the maximum of all these data    
M = max( cellfun(@(x)max(x(:)), {t.matrix}) );

ここで、全体の最大値ではなく、列ごとの最大値を見つけたい場合 (各列に (x,y,z) 座標があると仮定すると、次のようにする必要があります)。

% example data
tracks = struct(...
    'matrix', {rand(2,3) rand(4,3)})

% compute column-wise max 
M = max( cat(1, tracks.matrix) )

これが機能するのは、 が多次元構造体であるtracks.matrix場合の呼び出しは、セル配列の内容を展開することと同じだからです。tracks

tracks.matrix         % call without capture equates to:

C = {tracks.matrix};  % create cell
C{:}                  % expand cell contents
于 2012-11-27T06:49:02.040 に答える