Използването на pca се срива в Matlab

За този проблем не разбирам защо моят MATLAB се срива всеки път, когато стартирам своя pca ред. Използвам pca върху матрица, съдържаща аномалните лица, както е описано по-долу:

pics.mat съдържа матрични данни от 40 изображения всяко с размери 96*64 пиксела. (матрица 96*64*40)

въведете описание на изображението тук

Моят код за този раздел е:

%% problem 1a: finding average face
load('pics.mat'); % loads the file

% combines the 3d matrix into a 2d matrix
total = [pics(:, :, 1)]; 
for i = 2:40
    total = [total + pics(:, :, i)];
end

size(total) %96 by 64
A1 = total/40 % the average values divided by total # of faces for avg face


%% problem 1b: the anomalous face
Anom = [];

for i = 1:40
    Anom(:, :, i) = [pics(:, :, i) - A1]; % subtract the average face from all 40 images
end

Това, с което имам проблем, е, че когато правя този раздел, който включва използването на pca върху 40-те аномални лица от част b, моят MATLAB се срива.

въведете описание на изображението тук

Моят код за този раздел е:

%% problem 1c I: pca
Anom = reshape(Anom, [6144 40]); % reshapes a 3d into 2d

[eigenfaces,scores,sigma2] = pca(Anom', 'Centered' ,'off'); % this crashes MATLAB

Защо това се срива? Дали е заради моя код от предишните раздели или е поради факта, че го изпълнявам на изключително анемичен лаптоп?


person Jack L.    schedule 12.03.2015    source източник
comment
64-битова ОС ли е? Ако не, може да искате да проверите потреблението на памет от matlab.exe веднага след срива - дори от диспечера на задачите.   -  person Ofek Shilon    schedule 12.03.2015
comment
Най-вероятно имате слаб компютър и кодът е твърде много за Matlab. Matlab обикновено не се срива при грешки в кода.   -  person Ander Biguri    schedule 12.03.2015
comment
Да, изпълнявам това на Windows 8 64bit. Вероятно е паметта; Пробвах pca на много по-малка матрица и работи.   -  person Jack L.    schedule 12.03.2015


Отговори (1)


Имах подобен проблем, при който размерността прави изчислението непосилно. Тази връзка на Cootes Active Shape Models, в Приложение C той трансформира своя D в T, за да се справи с размерността на матрицата.

Надявам се да е приложимо и във вашия случай, защото ме спаси от много проблеми.

Ето как го реших в MatLab:

imvecs = вектор от изображения

средна стойност = тяхната средна стойност

size(imvecs,2) = броят изображения в моя набор от данни (N)

function [T, D] = covarianceMatrix(imvecs, meanval)
    D = [];
    for i = 1:size(imvecs,2),
       diff = imvecs{i} - meanval;
       D = [D, diff];
    end
    %Dimensionality reduction
    T = (D' * D) ./ (size(imvecs,2));
return

T вече е матрица с размер NxN, която, надяваме се, е по-лесна за изчисляване, без да изчерпва паметта.

Късмет!

person RKrogh    schedule 17.02.2016