Как добавить матрицу (не того же размера) ниже другой матрицы - PullRequest
1 голос
/ 29 ноября 2011

Я знаю, как добавить матрицу ниже другой матрицы.

например, A = [A; B];

У меня есть две матрицы разных размеров (различное количество столбцов и строк), и мне нужно сложить их вместе. Одна матрица является основной, а другая добавляется к ней. Оба они находятся в цикле for, поэтому размер первой матрицы постоянно меняется.

e.g for i = 1 :3
      AngerHist = [AngerHist;Hist];
    end

Когда я запускаю, это выдает мне эту ошибку:

??? Error using ==> vertcat CAT arguments dimensions are not consistent. – 

Как мне это сделать? Есть предложения?

AngerHist = {}; DisgustHist = {};FearHist = {}; HappyHist = {}; SadHist = {};SurpriseHist = {};
Images = 'C:\Users\HP\Documents\MATLAB\Images';
List = dir(Images);
n= size(List,1);

for i = 3:n
    List1 = dir(fullfile(Images,List(i).name));
    m= size(List1,1);
    BASE_DIR = fullfile(Images,List(i).name);
    for j = 3: m
        I=List1(j).name;
        I1= imread(fullfile(BASE_DIR,I),'jpg');
        Name = List(i).name;
        switch (Name)
                 case 'Anger'
                     Hist = UniformLBP(I1);
                     AngerHist = {AngerHist;Hist};
                     break;
                 case 'Disgust'
                     Hist = UniformLBP(I1);
                     DisgustHist = {DisgustHist;Hist};
                     break;
                case 'Fear'
                    Hist = UniformLBP(I1);
                    FearHist = {FearHist;Hist};
                    break;
                case 'Happy'
                    Hist = UniformLBP(I1);
                    HappyHist = {HappyHist;Hist};
                    break;
                case 'Sad'
                    Hist = UniformLBP(I1);
                    SadHist = {SadHist;Hist};
                    break;
                case 'Surprise'
                    Hist = UniformLBP(I1);
                    SurpriseHist = {SurpriseHist;Hist};
                    break;
        end        

    end    
end

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

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

Представьте себе две матрицы:

A = [ a b c ;
      d e f ;             
      g h i ]

B = [ q r;
      s t ]

и вы пытаетесь выполнить:

C = [A;B]

какие размеры будет иметь C? Это не определено.

Вы можете добавить B к столбцу нулей (или чего-то еще), чтобы сделать его правильной ширины, чтобы C в конечном итоге выглядел так:

| a b c |
| d e f |
| g h i |
| q r 0 |
| s t 0 |

или

| a b c |
| d e f |
| g h i |
| 0 q r |
| 0 s t |

но это просто хак, чтобы заставить работать матричную укладку.

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

2 голосов
/ 29 ноября 2011

Я думаю, что вам нужно использовать клетки:

A={};
A=[A;rand(2,3)];
A=[A;rand(3,4)];
A=[A;rand(4,5)];
A=[A;rand(6,5)];

Результат:

A = 
 [2x3 double]
 [3x4 double]
 [4x5 double]
 [6x5 double]
2 голосов
/ 29 ноября 2011

Чтобы вертикально сложить две матрицы, они должны иметь одинаковое количество столбцов.Например:

A = rand(3,2);
for ctr = 1:3
    B = rand(4,2);
    A = [A ; B];
end

В конце A будет 15x2.Аналогичным образом, если матрицы имеют одинаковое количество строк, вы можете расположить их по горизонтали.

Если матрицы имеют разное количество строк и столбцов, то нет смысла использовать матрицу для представления их коллекции.Вы можете вместо этого сделать каждую матрицу записью в массиве ячеек.См. документацию для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...