我想将矩阵M转换为" tall-skinny"格式。对于M的行和列中的每个r和c,得到的矩阵将具有类似[r,c,M(r,c)]的行。是否有这样的函数?或者,是否存在反向的功能?
答案 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不同的方式,使用sub2ind
和ind2sub
进行反向操作。我怀疑这是比他们更好的解决方案。
转换为" 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(:)]