Matlab: вычесть каждое значение в строке из любого другого, для каждой строки - PullRequest
1 голос
/ 29 марта 2011

У меня есть такие данные: [...

0 ... 0 ... 0 ... 0
6 ... 0 ... 0 ... 0
8 ... 5 ... 2 ... 0
9 ... 8 ... 3 ... 1
0 ... 0 ... 0 ... 0

В каждой строке я бы хотел вычесть каждое значение индивидуально из каждого другого в этом ряду. Так что я получаю новую матрицу, которая показывает все различия, как это: [...

1011 * нуль * 0
3 ... 6 ... 3
1 ... 6 ... 8 ... 5 ... 7 ... 2
нуль

Надеюсь, вы понимаете, о чем я. Я не хочу вычитать 0 из чего-либо (для меня O - ноль, если у вас есть способ заменить 0 на ноль, это нормально). Или, по крайней мере, если это нужно сделать, я хочу, чтобы эти результаты были отброшены. Но я хочу, чтобы там был какой-то заполнитель, когда строка целиком состоит из 0.

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

1 Ответ

2 голосов
/ 29 марта 2011

Вы можете использовать PDIST для расчета расстояний:

data =[0 0 0 0
6 0 0 0
8 5 2 0
9 8 3 1
0 0 0 0];
nRows = size(data,1);

%# for speed, preassign 'out'
out = cell(nRows,1);

for r = 1:nRows
   pts = data(r,data(r,:)>0); %# this assumes valid entries are >0
   switch length(pts),
   case 0,
      out{r} = []; %# empty for 'null'
   case 1, 
      out{r}=0; %# zero if only one valid number
   otherwise
      out{r}=pdist(pts'); %'# calculate all differences
   end
end

%# You access elements of a cell array with curly brackets
>> out{3}
ans =
     3     6     3
...