How to sum by 3d array?

4 ビュー (過去 30 日間)
Tiina
Tiina 2016 年 1 月 6 日
コメント済み: Andrei Bobrov 2016 年 1 月 8 日
Hi,
I have the following sample columns structured in a 3D array of 2 pages (:,:,1) and (:,:,2). I want to produce out1 as a sum of 2 rows as indicated by s over page 1. That is, s is 2 sum 2 rows of data(this occurs on page 1 as indicated by idx1, if s is 3 sum 3 rows of data... idx1 is an index of each page that rolls over all rows, idx2 is the the row number. I cannot use permute/reshape as the rows in each page changes significantly in the actual data set. Could you please advise? Thanks
idx1=[1 1 1 1 2 2 2 2 2]';
idx2=[ 1 2 3 4 1 2 3 4 5]';
s=[2 2 2 2 3 3 3 3 3]';
data=[10 11 9 13 2 4 3 1 3]';
out1= [nan 21 20 22 nan nan 9 8 7]';
out2=[nan 2 3 4 nan nan 3 4 5]'

採用された回答

Andrei Bobrov
Andrei Bobrov 2016 年 1 月 6 日
編集済み: Andrei Bobrov 2016 年 1 月 6 日
out1 = cell2mat(accumarray(idx1,(1:numel(data))',[],...
@(x){[nan(s(x(1))-1,1);conv2(data(x),ones(s(x(1)),1),'valid')]}));
out2 = idx2;
out2(isnan(out1))=nan;
  2 件のコメント
Tiina
Tiina 2016 年 1 月 8 日
Thanks Andrei, just a quick question if i dont have idx2, how do i recover it from a 3d array if i had idx1, s and data?
Andrei Bobrov
Andrei Bobrov 2016 年 1 月 8 日
[~,~,c] = unique(idx1);
idx2 = cell2mat(accumarray(c,1,[],@(x){(1:numel(x))'}));

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeNumeric Types についてさらに検索

タグ


Translated by