Выбор элементов из матрицы в Matlab - PullRequest
0 голосов
/ 20 февраля 2012

У меня есть матрица 36 x 2, но я хочу разделить элементы, чтобы получить 18, 2 x 2 матриц сверху вниз.Например, если у меня есть матрица:

1  2
3  4
5  6
7  8
9  10
11  12
13  14
...  ...

Я хочу разбить ее на отдельные матрицы:

M1 = 1  2
     3  4

M2 = 5  6
     7  8

M3 = 9  10
     11 12   

.. и т. Д.

Ответы [ 3 ]

3 голосов
/ 20 февраля 2012

может быть полезен следующий пример кода:

a=rand(36,2);
b=reshape(a,2,2,18)

, затем с помощью третьего индекса b вы можете получить доступ к вашим 18 матрицам 2x2, например.b (:,:, 2) дает вторую матрицу 2x2.

2 голосов
/ 20 февраля 2012

Я думаю, что прямой ответ на ваш вопрос:

sampledata = [...
    0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09 0.10 0.11 0.12 0.13 0.14 0.15 0.16 0.17 0.18 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14 1.15 1.16 1.17 1.18; ... 
    0.19 0.20 0.21 0.22 0.23 0.24 0.25 0.26 0.27 0.28 0.29 0.30 0.31 0.32 0.33 0.34 0.35 0.36 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.28 1.29 1.30 1.31 1.32 1.33 1.34 1.35 1.36];

for ix = 1:(size(sampledata,2)/2)
    assignin('base',['M' sprintf('%02d',ix)], sampledata(:,ix*2+[-1 0]))
end

Это создает 18 переменных с именами от «M01» до «M18» с частями матрицы sampledata.


Однако, пожалуйста, не используйте такие имена динамических переменных. Это усложнит любой другой фрагмент кода, к которому он относится. Используйте массив ячеек, трехмерный массив (как предложено @Johannes_Endres +1 BTW) или структуру. Все, что избавляет вас от необходимости писать что-то подобное позже:

%PLEASE DO NOT USE THIS
%ALSO DO NOT BACK YOURSELF INTO A CORNER WHERE YOU HAVE TO DO IT IN THE FUTURE
varNames = who('M*');
for ix = 1:length(varNames )
    str = ['result(' num2str(ix) ') = some_function(' varNames {ix} ');'];
    eval(str);
end

Я видел такой код, и он медленный и чрезвычайно громоздкий в обслуживании, не говоря уже о головной боли и боли в вашем внутреннем косметометре.

0 голосов
/ 20 февраля 2012
x = reshape(1:36*2,[2 36])'

k = 1
for i = 1:2:35
    eval(sprintf('M%d = x(%d:%d,:);',k,i,i+1));
    k = k+1;
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...