본문 바로가기

Enginius/Matlab

Square Matrix를 여러개의 Sub Matrix로 나누기


위의 그림과 같이 Matrix를 나눠서 그루핑하는 코드를 작성 


수행 결과

Total Data Matrix 

    0.8024    0.8276    0.7137    0.2824    0.2484    0.3097

    0.2389    0.3014    0.9827    0.4047    0.7002    0.4005

    0.8046    0.3181    0.0585    0.1593    0.5042    0.9498

    0.2743    0.4722    0.0372    0.3397    0.4923    0.9076

    0.3968    0.8018    0.3257    0.6240    0.6685    0.4235

    0.9832    0.4416    0.3409    0.9505    0.5189    0.8194


1-group 1-th sub matrix 

    0.8024    0.8276

    0.2389    0.3014


1-group 2-th sub matrix 

    0.0585    0.1593

    0.0372    0.3397


1-group 3-th sub matrix 

    0.6685    0.4235

    0.5189    0.8194


2-group 1-th sub matrix 

    0.7137    0.2824

    0.9827    0.4047


2-group 2-th sub matrix 

    0.5042    0.9498

    0.4923    0.9076


2-group 3-th sub matrix 

    0.3968    0.8018

    0.9832    0.4416


3-group 1-th sub matrix 

    0.2484    0.3097

    0.7002    0.4005


3-group 2-th sub matrix 

    0.8046    0.3181

    0.2743    0.4722


3-group 3-th sub matrix 

    0.3257    0.6240

    0.3409    0.9505


코드

%% 초기화 

clc; clear all; close all;


%% Matrix 의 index set

MatrixSize = 6;           % Matrix의 크기 

nrGroup    = 3;           % 몇 개의 group으로 나눌지 여부 

k = MatrixSize/nrGroup;   % 하나의 group에 해당하는 sub matrix의 크기 

DataMatrix = rand(MatrixSize, MatrixSize);  % 랜덤으로 Matrix를 만든다. 


% 먼저 Full Matrix의 index set을 구한다. 

idxSet = cell(nrGroup, nrGroup);

for i = 1:nrGroup

    for j = 1:nrGroup

        i_start = 1+(i-1)*k;

        i_end = i*k;

        j_start = 1+(j-1)*k;

        j_end = j*k;

        [mesh_i, mesh_j] = meshgrid(i_start:i_end, j_start:j_end);

        mesh_idx = [mesh_i(:) mesh_j(:)];

        idxSet{i, j} = [mesh_idx-repmat([0 1], k*k, 1)]*[1, MatrixSize]';

    end

end


%% Matrix의 subMatrix의 index set 

% SubMatrix의 index set을 구한다. 

subIdxSet = cell(nrGroup, 1);

for i =1:nrGroup

    subIdxSet{i} = [ [1:nrGroup]', mod([1:nrGroup]' + i-2, nrGroup)+1 ];

end


%% [테스트] 해당 그룹에 속하는 sub matrix를 구한다. 

clc;


% 결과를 확인해본다. 

% 전체 Data Matrix 

fprintf('Total Data Matrix \n');

disp(DataMatrix); 


for group_idx = 1:nrGroup

    % 각 group의 idx에 대해서 

    for sub_mtx_i = 1:nrGroup

        % 해당 group의 sub matrx의 idx에 대해서 

        subIdxList = subIdxSet{group_idx};

        subMtxList = cell(nrGroup, 1);

        % Sub Matrix들의 list를 구한다. 

        for i = 1:nrGroup

            idxList  = idxSet{subIdxList(i, 1), subIdxList(i, 2)};

            subMtxList{i} = reshape(DataMatrix(idxList), k, k)';

        end

        fprintf('%d-group %d-th sub matrix \n', group_idx, sub_mtx_i);

        disp(subMtxList{sub_mtx_i});

    end

end


파워포인트 그림 

subMatrix.pptx






'Enginius > Matlab' 카테고리의 다른 글

Rename bunch of files in Matlab  (0) 2014.08.05
bar plot  (0) 2014.04.11
Double indexing (두 개의 for loop을 하나로 줄이기)  (0) 2014.03.19
두 선분 사이의 각도를 구해보자.  (5) 2014.03.10
[cprintf] colored print in console  (0) 2014.02.20