3

私は100Kの構造体の配列を持っています。そのような構造体の内容を以下にリストします。

反復:1

BlockID:86

BlockIDの値は1から100の間です。BlockIDの発生回数を調べたいです。例:BlockID"1"が25回発生しました。BlockID「98」は58回発生しました。

オンラインで調べて、これらのリンクに記載されているオプションを試しましたが、解決策を得ることができませんでした 。Matlab:特定のコンテンツを持つ構造体の数 を数える方法matlabのセルの一意の要素を数える方法? Matlab:セルに格納されている一意の文字列の数を計算するにはどうすればよいですか?

4

3 に答える 3

1

arrayfunおよびを使用できますcount_unique(count_uniqueは公式の関数ではありません。matlabの中央ファイル交換からのものであり、ここにあります):

ids= arrayfun(@(x)x.BlockID, struct1);
[vals, counts] = count_unique(ids);

注意: rody_oが指摘しているように(インデックス作成が不要であるという事実を見逃していましたが)、IDを連結する別の方法があります。

ids = [struct1.BlockID];

count_uniqueまたは、必要に応じて独自の関数を作成することもできます。

function [counts, uns] = count_unique(ids)
uns= unique(ids);
counts = arrayfun(@(x)sum(ids == x), uns);
于 2012-08-02T20:37:02.890 に答える
1

簡単にするために、「1」と「3」の間の値を持つBlockIDを持つサイズ10の構造体配列があるとします。

%generate the struct array
for n = 1:10 
    structs(n).BlockID = num2str(randi(3));
end
%structs.BlockID : 3     2     1     3     3     2     1     1     2     2

BlockIDの発生数を確認するには:

count = accumarray(str2double({structs.BlockID})',1);
%count : 3     4     3

ここで、count(i)は、値'i'のBlockIDの出現回数です。

英語が下手でごめんなさい。

于 2012-08-03T03:15:33.967 に答える
1

histとと組み合わせて、Matlab独自のインデックス作成手法を簡単に使用できますunique

% sample data

a(1).BlockID   = 68
a(1).iteration = 1

a(2).BlockID   = 88
a(2).iteration = 12

a(3).BlockID   = 88
a(3).iteration = 14

a(4).BlockID   = 16
a(4).iteration = 18

% collect all BlockID values into array
b = [a.BlockID];

% count unique entries
[occurrences, entries] = hist(b, unique(b))

出力:

occurrences =
    1     1     2
entries =
    16    68    88

[struct(indices).member]表記法と同じくらい広く適用できるものが非常に少数の開発者によって知られている(または使用されている) ことは常に驚くべきことです...

于 2012-08-03T09:48:03.867 に答える