Sum: every nth column and groups/blocks of columns
11 visualizzazioni (ultimi 30 giorni)
Mostra commenti meno recenti
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 Commenti
Risposta accettata
Bruno Luong
il 24 Ago 2022
Modificato: Bruno Luong
il 24 Ago 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 Commenti
Bruno Luong
il 24 Ago 2022
Not only fewer line of code. It probably the fatest as it avoid matrix transposition.
Più risposte (2)
Dyuman Joshi
il 24 Ago 2022
Modificato: Dyuman Joshi
il 24 Ago 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)
Vedere anche
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!