Девиация трехмерной матрицы

Форум, посвященный общим вопросам, связанным с MATLAB

Модератор: Admin

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Девиация трехмерной матрицы

Сообщение tur91 » Вт июн 14, 2016 5:42 pm

Дана матрица М(rows,cols,n), т.е. n матриц rows x cols. Нужно посчитать девиацию вдоль этих n матриц для каждого пикселя. Причем сделать это быстро.
Ниже следующий код очень медленный.

Код: Выделить всё

rows = size(M,1); cols = size(M,2);
SD = zeros(rows,cols);
for r = 1:rows
  for c = 1:cols 
    ones_pix = M(r,c,:);
    ones_pix = ones_pix(:);
    SD(r,c) = std(ones_pix);
  end
end

Grizzly
Пользователь
Сообщения: 843
Зарегистрирован: Сб май 28, 2011 2:00 am

Re: Девиация трехмерной матрицы

Сообщение Grizzly » Вт июн 14, 2016 9:48 pm

Код: Выделить всё

SD = std(M,0,3)

tur91
Пользователь
Сообщения: 142
Зарегистрирован: Пн май 05, 2008 4:22 pm

Re: Девиация трехмерной матрицы

Сообщение tur91 » Вт июн 14, 2016 10:35 pm

Grizzly, спасибо!

я считал, что ф-ции в матлабе работают однообразно: напр для плоской матрицы mean(M) выдает среднее столбцов и std должна работать также. Поэтому сделал промежуточный вариант:

Код: Выделить всё

function targ_matrix_povorot
% ответ: матрица размером А[rows cols]
a = [0 1; 2 3; 4 5]; b = [6 7; 8 9; 10 11];
c = [12 13;  14 15; 16 17]; d = [18 19; 20 21; 22 23];
M(:,:,1) = a'; M(:,:,2) = b'; M(:,:,3) = c'; M(:,:,4) = d';
[rows cols n] = size(M); N = zeros(n, cols, rows);

for r = 1:rows
  T = zeros(n,cols);
  for i = 1:n
    m = M(:,:,i);
    row = m(r,:);
    T(i,:) = row;
  end
  N(:,:,r) = T;
end

mn = mean(N); A = zeros(rows,cols);

for i = 1:rows % size(N,3)
  A(i,:) = mn(:,:,i);
end
end

Оказывается так SD = mean(M,0,3); не работает, а работает так: MN = mean(M,3);

Эх, вот так помогал бы кто-нибудь мне в работе.