MATLAB Answers

左辺の添字インデック​スになる配列(左辺の​配列より要素数が多い​)に複数の同値がある​場合、右辺の配列の対​応値をすべて左辺の配​列の添字インデックス​にあたる位置に加算す​る方法について

2 views (last 30 days)
Toshikatsu
Toshikatsu on 29 Jan 2020
Answered: Toshikatsu on 30 Jan 2020
皆さま
for文を使うと、添字インデックスになる配列が逐次処理されるので、望んだ処理(同じ添字
の場合に、今の値に新規の値を足しこむ)が行われるのですが、ベクトル化しようとすると
添字になる配列の最後に出てくる時点の値のみが保存されます(あたりまえですね)。
スクリプトは、
a=zeros(128,1);
a(b)=c+a(b);
ここでbは添字インデックスになる配列、cは加算したい配列です。b, cは同じ要素数を持ち
aの要素数より多いです。
ベクトル化に関して、アドバイスがいただけましたらよろしくお願いします。

  1 Comment

T.Tomita
T.Tomita on 29 Jan 2020
すみません。質問がよくわからないのですが、例えばaのサイズは1×5で添字配列bは b=[1,1,2,2,2,3,4,5] のように最小値1で最大値5(これはaの最大サイズに対応)だが、いくつか重複がある、ということですか? そして今の場合、a(1)にはc(1)とc(2)を加算し、a(2)にはc(3),c(4)およびc(5)を加算したい、ということでしょうか?

Sign in to comment.

Answers (5)

T.Tomita
T.Tomita on 30 Jan 2020
素敵な関数がありました.累算による配列作成
b = [1,1,2,2,2,3,4,5]; % 添字配列
c = [1,2,3,4,5,6,7,8]; % sample
a = accumarray(b(:),c(:))';

  0 Comments

Sign in to comment.


Toshikatsu
Toshikatsu on 30 Jan 2020
コメントありがとうございます。
はい、おっしゃるとおりです(書き方がつたわりにくくなってましてすみません)。
for文使わない方法はありますでしょうか。

  0 Comments

Sign in to comment.


T.Tomita
T.Tomita on 30 Jan 2020
for文使わない方法はまだ考え中ですが,こういうのはどうですか?
a = zeros(1,5);
b = [1,1,2,2,2,3,4,5]; % 添字配列
c = [1,2,3,4,5,6,7,8]; % sample
for i=1:length(b)
ind = b(i); % index
a(ind) = a(ind)+c(i);
end

  0 Comments

Sign in to comment.


Toshikatsu
Toshikatsu on 30 Jan 2020
ありがとうございます。
今は添字配列が長くなる(同じポイントに足し算する回数が多い)計算をしてまして、
添字配列をループの引数にするのを避けられたら、と思っています。

  0 Comments

Sign in to comment.


Toshikatsu
Toshikatsu on 30 Jan 2020
ありがとうございます。
改めて先人の皆様に感謝したいです。
こちらの関数つかいます。
今後もよろしくお願いします。

  0 Comments

Sign in to comment.

Sign in to answer this question.