4

本当に必要なコードを書くには、accumarray を理解する必要があります。

http://www.mathworks.co.kr/kr/help/matlab/ref/accumarray.htmlを理解しようとしました

ほとんどの例は明確でした。

しかし、例 2 の 1 番目の例では、

B の (1,2) 番目の要素は 1 でなければなりません

なぜなら

(1,2) = 1st, 2nd of subs
1st, 2nd of vals = 101, 102
sum(diff([101,102]))=1

また、例2の2番目の例では、

B1 の (1,2) 番目の要素は -2 ではなく 2 にする必要があります

なぜなら

(1,2) = 1st, 3rd of subs
1st, 3rd of vals = 101, 103
sum(diff([101,103]))=2

そして私も思った

B1 の (4,1) 番目の要素は -1 ではなく 1 にする必要があります

なぜなら

(4,1) = 5,6th of subs
5,6th of vals = 105,106
sum(diff([105,106]))=1

私は何が欠けていますか?

訂正してください。自分のコードを書くには、accumarray を深く理解する必要があります。

4

2 に答える 2

1

その理由はgrantnzの答えにあります。予測可能な動作を得る方法は次のとおりです。

ドキュメントにあるように、「添字subsがソートされていない場合funは、入力データの値の順序に依存しないでください。」したがって、 から予測可能な動作を得るにaccumarrayは、サブをソートする必要があります。

行列内の (行、列) の位置を表す添字についてこれが意味することは、添字が指す要素は、線形インデックスに従って順序付けする必要があるということです。したがって、2D 添字を「ソート」するには、同等の線形インデックスをソートする必要があります。次に、その順序を に適用する必要がありますvals。そうしないと、データが混乱してしまいます。

val = 101:106;
subs = [1 2; 1 2; 3 1; 4 1; 4 4; 4 1];

% convert the subscripts to linear inds and sort them
inds = sub2ind([4 4],subs(:,1),subs(:,2));
[indsSorted,sortingInds] = (sort(inds));

% apply the sorting to val
valsSorted = val(sortingInds);

% convert inds back to subs
[iiS jjS] = ind2sub([4 4],indsSorted);
subsSorted = [iiS jjS];

B = accumarray(subsSorted,valsSorted,[],@(x)sum(diff(x)))

B =

     0     1     0     0
     0     0     0     0
     0     0     0     0
     2     0     0     0

少なくとも、これがドキュメントのメモが言っていることであることがわかります。

于 2013-11-01T17:50:23.163 に答える