Как создать матрицу из разных матриц с разным количеством строк в Matlab?

У меня есть цикл for в Matlab, в котором я хочу сделать матрицу из разных матриц с разным количеством строк (я не знаю, какая будет разница в количестве строк). Например, у меня есть две матрицы: 10x1 и 4x1. Как я могу сделать матрицу из них обоих. (В этом случае я знаю, в чем разница, но в моем цикле я не узнаю их различий.)

A =

    0.1000
    0.5000
    0.6000
    0.8000
    0.3000
    0.2000
    0.7000
    0.6000
    0.1000
    1.0000

B =

    0.1000
    0.2000
    0.3000
    0.4000

C =

    0.1000    0.1000
    0.5000    0.2000
    0.6000    0.3000
    0.8000    0.4000
    0.3000       NaN
    0.2000       NaN
    0.7000       NaN
    0.6000       NaN
    0.1000       NaN
    1.0000       NaN

Я хочу, чтобы моя последняя матрица была похожа на C.


person Mandana    schedule 16.10.2014    source источник
comment
Если ваша матрица 10x1 равна A, а ваша матрица 4x1 равна B, то вы можете сделать M=[A;B]. Если вы хотите добавить еще одну матрицу Nx1 C, выполните M=[M;C].   -  person David    schedule 16.10.2014
comment
Спасибо за ваш ответ. Но то, что я хочу, - это комбинация A и B в виде матрицы столбцов 10 на 2, которая имеет ноль или NAN для отсутствующих строк в матрице B.   -  person Mandana    schedule 16.10.2014


Ответы (2)


Двойные массивы

Вы можете создавать матрицы в MATLAB путем объединения других матриц вместе, если результат прямоугольный. Итак, согласно вашему примеру, новую матрицу/вектор можно создать, выполнив следующие действия, поскольку конкатенация приводит к прямоугольному выводу:

u   = rand(10,1);
v   = rand(4,1);
newVector = [u;v];

Однако вы не можете просто объединить u и v в разные столбцы, поскольку их количество строк различается. Таким образом, необходима какая-то заливка, чтобы сбалансировать количество строк:

newMatrix = [ u , [v ; zeros(length(u)-length(v),1)]];

где несуществующие строки v были заполнены вектором 0s. Если вы хотите заполнить NaN, просто умножьте нулевой вектор на NaN. Если вы не знаете, какая длина у u или v больше, вы можете сделать следующее:

maxRows   = max([length(u),length(v)]);
nFillRows = abs(length(u) - length(v));

%   The fill vector will be empty if the vector has the maximum number of rows
uColumn   = [u ; zeros( nFillRows * (length(u) ~= maxRows) ,1)];
vColumn   = [v ; zeros( nFillRows * (length(v) ~= maxRows) ,1)];

newMatrix = [uColumn,vColumn];

Чтобы это работало, необходимо знать количество добавляемых строк. Это можно настроить рекурсивно, чтобы сделать newMatrix все больше и больше (хотя может потребоваться использование size(), если u или v является матрицей, а не вектором); однако динамически растущие массивы могут сильно снизить производительность.

Массивы ячеек

Если целью цикла for является создание списка векторов, которые вы просто хотите сохранить и использовать позже, массив ячеек может быть хорошей структурой данных для использования:

vectorStorage = {u,v};

Поскольку каждый элемент массива ячеек может иметь свой собственный отдельный тип данных, не имеет значения, что u и v имеют разную длину. Из командной строки вы увидите это:

>> vectorStorage = {u,v}

vectorStorage = 

    [10x1 double]    [4x1 double]

Первый элемент — вектор u, а второй элемент — вектор v. Вы можете вызвать сохраненное значение, указав индекс в фигурных скобках: all(u == vectorStorage{1}) == 1.

person TroyHaskin    schedule 16.10.2014
comment
Спасибо за полный ответ. - person Mandana; 16.10.2014

Если ваш первый вектор A, создайте M по M=A, затем для каждого нового вектора, который вы хотите добавить, вы можете использовать этот код:

if length(B)>size(M,1)
    M=[M;nan(length(B)-size(M,1),size(M,2))];
    M=[M B];
else
    M=[M [B;nan(size(M,1)-length(B),1)]];
end

Хотя предложение Троя об использовании массива ячеек является хорошей идеей для такой ситуации.

person David    schedule 16.10.2014