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

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

1 个评论

Takumi
Takumi 2020-1-29
すみません。質問がよくわからないのですが、例えば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)を加算したい、ということでしょうか?

请先登录,再进行评论。

回答(5 个)

Takumi
Takumi 2020-1-30

1 个投票

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

0 个投票

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

0 个投票

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
Toshikatsu
Toshikatsu 2020-1-30

0 个投票

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

0 个投票

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

类别

帮助中心File Exchange 中查找有关 Creating and Concatenating Matrices 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!