Sum: every nth column and groups/blocks of columns
1 Ansicht (letzte 30 Tage)
Ältere Kommentare anzeigen
Dom
am 24 Aug. 2022
Bearbeitet: Dyuman Joshi
am 24 Aug. 2022
Hi:
Is there any way to improve this code?
Thanks
Dominic
%
% Flows between sectors of countries
% 3 countries with 4 sectors
% Row and column headings are the same C1S1 C1S2 ......C4S3 C4S4
%
c=3; % no. of countries
s=4; % no. of sectors
X=magic(c*s); % 12
%
% add every 4th (sth) column of a matrix: 1,5,9 ... 4,8,12
% - result 12x4 (sum by sector)
%
S=sum(X(:,1:s:end),2); % 1:4:end
for k=2:s % 2:4
SS=sum(X(:,(k):s:end),2);
S=horzcat(S,SS);
end
%
% add columns in blocks of 4: 1-4, 5-8, 9-12 - result 12x3 (sum by country)
%
C=sum(X(:,[1:s]),2); % [1:4]
x=(s+1):s:(c*s); % 5:4:12
y=(2*s):s:(c*s); % 8:4:12
for k=[x;y]
CC=sum(X(:,[k(1):k(2)]),2);
C=horzcat(C,CC);
end
0 Kommentare
Akzeptierte Antwort
Bruno Luong
am 24 Aug. 2022
Bearbeitet: Bruno Luong
am 24 Aug. 2022
c=3; % no. of countries
s=4; % no. of sectors
X=magic(c*s); % 12
XX = reshape(X,size(X,1),s,[]);
S = sum(XX,3)
C = squeeze(sum(XX,2))
3 Kommentare
Bruno Luong
am 24 Aug. 2022
Not only fewer line of code. It probably the fatest as it avoid matrix transposition.
Weitere Antworten (2)
Dyuman Joshi
am 24 Aug. 2022
Bearbeitet: Dyuman Joshi
am 24 Aug. 2022
%comment lines removed
c=3; % no. of countries
s=4; % no. of sectors
X=magic(c*s); % 12
Vectorized solution
S1=reshape(sum(reshape(X,[],c),2),[],s)
C1=reshape(sum(reshape(X',s,[])),[],c)
Siehe auch
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!