векторные нули исключения из матрицы - PullRequest
3 голосов
/ 21 января 2012

У меня есть матрица, как

frequencyarray =

    697    697    697    697    697    697      0      0    697
      0      0      0      0      0      0    770    770      0
      0      0      0      0      0      0      0      0      0
      0      0      0      0      0      0      0      0      0
   1209   1209   1209   1209   1209   1209   1209   1209   1209
      0      0      0      0      0      0      0      0      0
      0      0      0      0      0      0      0      0      0

Теперь я хотел бы убрать из него все нули на векторной базе и получить это

frequencyarray2 =

    697    697    697    697    697    697    770    770    697
   1209   1209   1209   1209   1209   1209   1209   1209   1209

Я хочу сделать это, только если в векторе ровно два ненулевых числа. Если вектор имеет больше или меньше двух ненулевых чисел, они должны быть заменены нулями.

Поэтому, если у меня есть что-то вроде:

frequencyarray =

      0      0    697    697
      0      0    770    770
      0      0      0      0
      0      0      0      0
   1209   1209   1209   1209
      0      0      0      0
      0      0      0      0

ответ должен быть:

frequencyarray2 =

      0      0      0      0

Используя find, это не работает, оно просто делает все на одном векторе. Я думал об использовании найти, а затем изменить форму. Но это работает, только если ровно два числа отличны от нуля на вектор.

Если возможно, я бы хотел избежать петель. Столбцы не имеют никакого отношения между ними.

Любая идея приветствуется

Ответы [ 3 ]

2 голосов
/ 21 января 2012

Вы можете использовать sum и find вместе. Что-то вроде:

frequencyarray(sum(frequencyarray==0)==2)
1 голос
/ 21 января 2012

полезный фрагмент кода для сравнения двух строк:

all( (frequencyarray(i,:) == 0) & (frequencyarray(i+1,:) ~= 0) ) 

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

Чтобы присоединиться к линиям, вы можете использовать:

i_cand = (frequencyarray(i,:) == 0
joined_line = frequencyarray(i,:); % start
joined_line(~icand) = frequencyarray(i+1,~icand); % end of joining
0 голосов
/ 21 января 2012

Ну ... я решил проблему. Даже не так, как хотелось бы, но это работает ... И это не обязательно должно быть очень быстрым.

Вот мое решение, если кому-то интересно:

function [collapsed] = collapse(frequencies)
    fsize = size(frequencies,2);
    collapsed = zeros(2,fsize);
    for it=1:fsize
        col = frequencies(:,it);
        nonzero = frequencies(find(col != 0));
        if (size(nonzero,1) == 2)
            collapsed(:,it) = nonzero;
        endif
    endfor
endfunction
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...