Как уменьшить размерность данных?
У меня есть набор из 25 изображений с ярлыком "Зараженный" и 25 изображений с ярлыком "Нормальный". Я пытаюсь извлечь коэффициенты, основанные на комплексном вейвлет-преобразовании двойного дерева, как функции для каждого из изображений.
Мой код для получения коэффициентов с использованием DT-CWT ia выглядит следующим образом:I = imread('infected_img1.jpg'); %read image
I = rgb2gray(I); %rgb ro gray-scale
L = 6; %no. of levels for wavelet decomposition
I = reshape(I',1,size(I,1)*size(I,2)); %change into a vector
I = [I,zeros(1,2^L - rem(length(I),2^L))]; %pad zeros to make dim(I) a multiple of 2^L
I = double(I);
dt = dddtree('cplxdt',I,L,'dtf3'); %perform DT-CWT
dt_Coeffs = (dt.cfs{L}(:,:,1) + 1i*dt.cfs{L}(:,:,2)); %extract coefficents at Level 6
Теперь, поскольку у меня есть еще 24 изображения для извлечения коэффициентов, я делаю этот блок для каждого из изображений. Моя конечная цель - добавить все векторы коэффициентов, сгенерированные в каждой итерации, для формирования матрицы. Но каждое изображение имеет тенденцию давать вектор коэффициента разного размера.
Я хочу знать о некотором методе уменьшения размерности, который может уменьшить каждый вектор до единого размера и в то же время сохранить его информацию. Кто-нибудь может предложить методы с хорошим количеством ясности?1 ответ
Как я уже упоминал в своем комментарии,
Вы не можете что-то сжать (т.е. удалить информацию) и при этом сохранить всю информацию.
Вместо этого вы можете заполнить все векторы длиной самого большого вектора, а затем объединить их для создания матрицы. Вы можете запрограммировать свой собственный метод, но в духе не изобретать колесо, которое я ранее использовал padcat()
, Это очень легко использовать и прокладки с NaN
но вы можете легко изменить это на 0
,
Вот пример использования, который также содержит удобное преобразование из NaN
в 0
,
>> a = [1 2 3 4];
>> b = [1 2 3];
>> c = padcat(a, b);
c =
1 2 3 4
1 2 3 NaN
>> c(isnan(c)) = 0
c =
1 2 3 4
1 2 3 0