matlab 矩阵reshape都是按照列展开的,opencv的cvmat是按照行展开的

最近要测试下数据,一个小问题明明觉得应该是正确的,哪知道老错误,今天参加summer school的时候和wdai讨论了下,发现应该是matlab和c++将

矩阵拉成向量的格式不一样,测试如下果然不一样,matlab是按照列展开的。opencv的cvmat是按照行展开的,matlab测试如下:

>> a = rand(4,3)


a =

    0.6787    0.6555    0.2769
    0.7577    0.1712    0.0462
    0.7431    0.7060    0.0971
    0.3922    0.0318    0.8235

>> b = reshape(a,[12 1])

b =

    0.6787
    0.7577
    0.7431
    0.3922
    0.6555
    0.1712
    0.7060
    0.0318
    0.2769
    0.0462
    0.0971
    0.8235

显然这个事按照列展开的。


如果想按行展开,代码如下:

>> c = reshape(a',[12 1])

c =

    0.6787
    0.6555
    0.2769
    0.7577
    0.1712
    0.0462
    0.7431
    0.7060
    0.0971
    0.3922
    0.0318
    0.8235


将向量变成矩阵也是按列。代码如下:

>> b1 = reshape(b,[4 3])

b1 =

    0.6787    0.6555    0.2769
    0.7577    0.1712    0.0462
    0.7431    0.7060    0.0971
    0.3922    0.0318    0.8235

>> c1 = reshape(c,[4 3])

c1 =

    0.6787    0.1712    0.0971
    0.6555    0.0462    0.3922
    0.2769    0.7431    0.0318
    0.7577    0.7060    0.8235


下面flag1 = 1,证明向量是按列成矩阵的

>> flag1 = isequal(a,b1)

flag1 =

     1
下面flag2 = 0,也证明向量是按列成矩阵的
>> flag2 = isequal(a,c1)

flag2 =

     0


下面是将矩阵按行展开的之后所得向量,再按照行变成矩阵代码

>> c2 = reshape(c,[3 4])'

c2 =

    0.6787    0.6555    0.2769
    0.7577    0.1712    0.0462
    0.7431    0.7060    0.0971
    0.3922    0.0318    0.8235


% flag3=1证明按照行变成矩阵成功了

>> flag3 = isequal(a,c2)

flag3 =

     1

有些非常非常小的问题也得用程序去测试,程序一般是不会错的,要相信。要仔细


你可能感兴趣的:(c,测试,matlab)