用matlab / octave'去旋转'矩阵

时间:2014-05-22 22:36:32

标签: arrays matlab matrix octave

我想将矩阵M转换为" tall-skinny"格式。对于M的行和列中的每个r和c,得到的矩阵将具有类似[r,c,M(r,c)]的行。是否有这样的函数?或者,是否存在反向的功能?

3 个答案:

答案 0 :(得分:3)

这是你想要的吗?

[ii jj] = ndgrid(1:size(M,1), 1:size(M,2));
T = [ii(:) jj(:) M(:)];

反向:

M = full(sparse(T(:,1), T(:,2), T(:,3)));

或更简单地说,如Jumppy89所述,

M = full(spconvert(T));

答案 1 :(得分:0)

如果能满足您的需求,我也很好奇 -

从正常到高瘦(基于meshgrid) -

[x1,x2] = meshgrid(1:size(M,1),1:size(M,2))
TSM = [x2(:) x1(:) M(:)] %// Tall-Skinny M

高瘦到正常(基于sub2ind并重塑) -

m1 = max(TSM(:,2))
n1 = max(TSM(:,1))
TSM3 = TSM(:,3)
M_out = reshape(TSM3(sub2ind([n1 m1],TSM(:,1),TSM(:,2))),m1,n1)

答案 2 :(得分:0)

您可以采用与Luis和Divakar不同的方式,使用sub2indind2sub进行反向操作。我怀疑这是比他们更好的解决方案。

转换为" tall-skinny"格式:

M = [1     1     1
     1     2     2
     2     1     3
     2     2     4]
S=zeros([max(M(:,1)) max(M(:,2))])
I=sub2ind([max(M(:,1)) max(M(:,2))],M(:,1),M(:,2))
S(I)=M(:,3)

相反:

[r,c]=ind2sub(size(S),1:numel(S))
M=[r.' c.' S(:)]