2014-10-23 2 views
-3

Я очень боится, чтобы спросить об этом, но я не знаю, какое-либо образом сместить индекс в разреженной матрице без петлисдвиг индекса разреженной матрицы без петли в MATLAB

разреженной матрицы является чем-то вроде этого

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 

любое предложение? спасибо

+0

I предложите вам объяснить, как вы добрались до 'out'. Где же «разреженные» матрицы? – Dan

+0

, но также вы можете посмотреть на * третий * вывод функции ['unique'] (http://www.mathworks.com/help/matlab/ref/unique.html). Вам все равно придется перебирать столбцы (или если вам просто нужны два столбца, дважды вызывайте 'unique') – Dan

+0

спасибо @Dan за ваш полезный комментарий Я попытался улучшить вопрос, показывающий разреженную матрицу –

ответ

0

Если я правильно понимаю, чтобы получить желаемый результат, вы в основном необходимо удалить столбцы и строки, содержащие все нули, а затем применить find:

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

Поскольку этот вопрос не является безответным, плохо завершите комментарий Данса в ответ. Допуская предположение на генерации out вектора и индекс г-го уникального элемента в строке, можно получить желаемый результат на

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 
0

Благодаря @Dan и @Nras

на самом деле, представляющий разреженную матрицу в полном режиме показывает мне, что это просто Лик вырезая нулевые строки и столбцы слева и сверху соответственно.

ответ очень просто может быть:

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

Но остальное беспокойство: нет никакого способа, чтобы сохранить исходные показатели для дальнейшего использования (например, если сдвинут индекс идентификатор пользователя)

+0

Да, удалите строки и столбцы которые содержат только нули, как я уже сказал в своем ответе –

Смежные вопросы