Использование 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. Вероятно, это память; Пробовал пса на гораздо меньшей матрице и работает.   -  person Jack L.    schedule 12.03.2015


Ответы (1)


У меня была аналогичная проблема, когда размерность делает расчет подавляющим. Эта ссылка Cootes Active Shape Models в Приложении C он преобразует свое D в T, чтобы справиться с размерностью матрицы.

Я надеюсь, что это может быть применимо и в вашем случае, потому что это спасло меня от многих неприятностей.

Вот как я решил это в MatLab:

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

среднее значение = их среднее значение

размер (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