在matlab中不使用循环移动稀疏矩阵的索引

时间:2014-10-23 08:55:18

标签: matlab indexing sparse-matrix shift

我真的不敢问这个问题,但是我不知道如何在没有循环的情况下改变稀疏矩阵的索引

稀疏矩阵是这样的

a = 
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0
     0     0     0     1     0     0     1
     0     0     0     0     0     0     0
     0     0     0     1     0     1     1
     0     0     0     0     0     0     0
     0     0     0     0     0     0     0

my initial matrix of indexes and value is:
a = [3 7 1;
     3 4 1;
     5 6 1; 
     5 7 1; 
     5 4 1 ]

uniq_x = [3,5]

uniq_y=[4,6,7]

期望的输出将是:

    out = [1 3;
           1 1; 
           2 2;
           2 3;
           2 1] 

我的初始解决方案如下:

for i=1:size(uniq_x ,1)
   a(a(:,1)==uniq_x(i,1),1)=i;
end

for i=1:size(uniq_y ,1)
   a(a(:,2)==uniq_y(i,1),2)=i;
end

有什么建议吗?感谢

3 个答案:

答案 0 :(得分:0)

由于这个问题未能得到解决,所以我总结了Dans'评论答案。假设生成out向量的假设确实是每行第i个唯一元素的索引,可以通过

获得所需的结果。
a = [3 7 1;
     3 4 1;
     5 6 1; 
     5 7 1; 
     5 4 1];

% desired output
out = [1 3;
       1 1; 
       2 2;
       2 3;
       2 1];

% suggested method to create out
[~,~,n_x] = unique(a(:,1)); % [1,1,2,2,2]'
[~,~,n_y] = unique(a(:,2)); % [3,1,2,3,1]'
out2 = [n_x, n_y]; % result

% check for desired == result
all(all(out==out2)) % true

答案 1 :(得分:0)

如果我理解正确,要获得所需的结果,您基本上需要删除包含全零的列和行,然后应用find

[jj ii] = find(a(any(a,2), any(a,1)).');
out = [ii jj];

答案 2 :(得分:0)

感谢@Dan和@Nras

实际上在完全模式下表示稀疏矩阵显示我就像从左侧和顶部切割零行和列一样。

答案非常简单:

a = a(:,any(a,1));
a = a(any(a,2),:);

但剩下的问题是:没有办法保留原始索引供将来使用(例如,如果移位索引是用户的ID)