フィルターのクリア

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

3 ビュー (過去 30 日間)
Toshikatsu
Toshikatsu 2020 年 1 月 29 日
回答済み: Toshikatsu 2020 年 1 月 30 日
皆さま
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 日
素敵な関数がありました.累算による配列作成
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 日
コメントありがとうございます。
はい、おっしゃるとおりです(書き方がつたわりにくくなってましてすみません)。
for文使わない方法はありますでしょうか。

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

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

カテゴリ

Help Center および File Exchangeループと条件付きステートメント についてさらに検索

Community Treasure Hunt

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

Start Hunting!