使用vertcat使用索引数组连接矩阵的列

时间:2014-06-12 06:22:41

标签: matlab matrix concatenation

假设我们有以下随机矩阵

a=rand(6,5)

a =

    0.8147    0.2785    0.9572    0.7922    0.6787
    0.9058    0.5469    0.4854    0.9595    0.7577
    0.1270    0.9575    0.8003    0.6557    0.7431
    0.9134    0.9649    0.1419    0.0357    0.3922
    0.6324    0.1576    0.4218    0.8491    0.6555
    0.0975    0.9706    0.9157    0.9340    0.1712

我们已对此矩阵进行了SVD分解。

[U E V]=svd(a);

如果我们想要连接第一,第三和第五列,我们就可以这样做

z=vertcat(U(:,1),U(:,3),U(:,5));

z的尺寸为

[m,n]=size(z)

m =

    18


n =

     1

但是假设我想要以下内容:我将声明一个包含这些索引或

元素的数组
b=[1 3 5]

b =

     1     3     5

然后

 z1=vertcat(U(:,b));

但尺寸为

 [m1 n1]=size(z1)

m1 =

     6


n1 =

     3

是否有可能在z1=vertcat(U(:,b));我改变某些东西以便直接给出我想要的结果?

3 个答案:

答案 0 :(得分:1)

当你看:

 a(:,1) =  0.8147    
           0.9058    
           0.1270    
           0.9134   
           0.6324    
           0.0975  

你得到一个垂直向量。通过执行vertcat,您可以垂直添加其他垂直向量,从而生成18x1向量。 如果您希望将其他列添加为列,则可以使用horzcat。通过使用作为水平向量的b,MATLAB相应地改变输出。
由于svd返回与输入相同维度的矩阵,因此U也是如此。
修改

要获得18x1向量作为结果,请使用:

z1=reshape(z1,18,1);

或使用

z1=z1(:);

答案 1 :(得分:1)

这应该可以解决问题

z1 = U(:,b);
z1 = z1(:);

答案 2 :(得分:1)

你所做的是正确的,但你必须在最后一步使用重塑功能,如:

z1 = reshape(Z1,1,18);