필터 지우기
필터 지우기

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

조회 수: 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 CenterFile Exchange에서 ループと条件付きステートメント에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!