3

私は Matlab を初めて使用しますが、他のプログラミング言語の経験はある程度あります。Matlab で MySQL からインポートした非常に大きなテーブルがあります。次のようなセル配列として与えられます。

 date   key     sales    weight  name
 12/11  101     1200     20      blue
 12/11  178     1200     70      purple
 13/11  209     1300     15      purple
 12/11  101     1200     10      blue
 14/11  678     1200     10      yellow
 12/11  340     1500     30      green
 17/11  178     1900     50      purple

そして、出力を次のようにしたい:

 key     sales    weight  name
 101     2400     30      blue
 178     3100     120     purple
 209     1300     15      purple
 678     1200     10      yellow
 340     1500     30      green

したがって、列「キー」に同じ番号を持つ行を結合したいと思います。一方、列「売上」と「重量」を合計し、列「名前」を保持したいと思います(各「キー」には同じ「名前」がありますが、各「名前」には複数の「キー」を含めることができます)

for ループでこれが可能であることはわかっていますが、多くのテーブルを同様の異なる方法で操作する必要があるため、これは計算集約的です。

同様の問題を読んだことがありますが、これは accumarray を使用して解決できますが、セル配列としてサブを持つ accumarray でこれを行うことはできますか? そして、それはどのように見えるでしょうか?

4

2 に答える 2

3

を使用した方法の 1 つを次に示しますが、セル マトリックスの代わりに新しいテーブルaccumarrayデータ構造を検討する価値があるかもしれません(簡単に変換できるはずです)。

T = {  101     1200     20      'blue'
       178     1200     70      'purple'
       209     1300     15      'purple'
       101     1200     10      'blue'
       678     1200     10      'yellow'
       340     1500     30      'green'
       178     1900     50      'purple'};

[u, ind, x] = unique([T{:,1}])

key = T(ind,1)
sales = accumarray(x', [T{:,2}])
weight = accumarray(x', [T{:,3}])
name = T(ind,4)

[key, num2cell(sales), num2cell(weight), name]
于 2014-01-15T11:27:19.757 に答える
2
x={ '12/11'  101     1200     20      'blue'
 '12/11'  178     1200     70      'purple'
 '13/11'  209     1300     15      'purple'
 '12/11'  101     1200     10      'blue'
 '14/11'  678     1200     10      'yellow'
 '12/11'  340     1500     30      'green'
 '17/11'  178     1900     50      'purple'};

[~,b,c]=unique([x{:,2}]);
y=[x(b,2),...
    num2cell(sparse(1,c,[x{:,3}]))',...
    num2cell(sparse(1,c,[x{:,4}]))',...
    x(b,[5])];

unique重複キーのインデックスを取得するために使用されます。sparse合計を取得するために使用されます。

于 2014-01-15T10:22:07.583 に答える