如何在另一个矩阵下添加矩阵(不是相同的维度)

时间:2011-11-29 13:45:41

标签: matlab

我知道如何在另一个矩阵下添加矩阵。

例如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 个答案:

答案 0 :(得分:2)

要垂直堆叠两个矩阵,它们必须具有相同的列数。例如:

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

最后,A将为15x2。同样,如果矩阵具有相同的行数,则可以水平堆叠它们。

如果矩阵具有不同的行数和列数,那么使用矩阵表示其集合是没有意义的。您可以考虑将每个矩阵设置为单元格数组中的条目。有关详细信息,请参阅the documentation

答案 1 :(得分:2)

问题不在于循环内的矩阵大小正在发生变化。这是允许的。问题是,要垂直堆叠两个矩阵,它们每个都需要具有相同数量的列。

想象一下有两个矩阵:

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 :(得分:2)

我认为你需要使用细胞:

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]