Пожалуйста, помогите мне Назначение имеет больше не-синглетонов RHS измерений, чем не-синглтон - PullRequest
1 голос
/ 15 мая 2010

В моем коде есть следующая ошибка

Назначение имеет больше не-одиночных RHS размеры, чем не синглтон

Это код:

 string =['d:\face\face\ffw' int2str(r) '_' int2str(Sel(nSelRow,t)) '.bmp'];
 A = imread(string);
 B = im2double(A);
 Train_Dat(:,:,s)=B;

Обновление 1:

Когда я обновил код, мы получили новую ошибку в следующей строке

мой код

for r=1:Class_Num
    for t=1:Class_Train_Num
        %string=['e:\face_lib\feret_80\ff' int2str(r) '_' int2str(t) '.tif'];
        string =['d:\face\face\ffw' int2str(r) '_' int2str(Sel(nSelRow,t)) '.bmp'];
        A=imread(string);
        B=im2double(A);
        Train_Dat(:,:,:,s)=B;
        Train_Dat_Vector(:,s)=B(:); %here new error Subscripted assignment dimension mismatch.
        s=s+1;
    end

Обновление 2:

my define for 
nImgW = 40;
nImgH = 40;
nImgSize = nImgW*nImgH;
Train_Dat_Vector = zeros( nImgSize, Train_Num );
            A=imread(string);
            B=im2double(A);
            Train_Dat(:,:,:,s)=B;
            Train_Dat_Vector(:,s)=B(:);%here i want convert matrix to 40x40,Train_Num
            s=s+1;

1 Ответ

4 голосов
/ 15 мая 2010

Я думаю, что проблема в том, что B, скорее всего, 3-D RGB-изображение , и вы пытаетесь назначить его для одной 2-D плоскости вашей 3-D матрицы Train_Dat. Если вы пытаетесь собрать набор трехмерных изображений для использования в качестве обучающих данных, вам придется сделать Train_Dat либо 4-мерную матрицу (если все ваши изображения имеют одинаковые размеры), либо массив ячеек (с одним изображением на ячейку):

Пример # 1: 4-D матрица ...

nRows = 100;  %# The number of rows in the images
nCols = 100;  %# The number of columns in the images
nDepth = 3;   %# The depth of the images (3 color planes for RGB images)
nImages = 5;  %# The number of images you will use
Train_Dat = zeros(nRows,nCols,nDepth,nImages);  %# Initialize to zeros
Train_Dat(:,:,:,1) = B;                         %# Assign B as the first image

Если вы хотите использовать эту опцию, но все ваши изображения не одного размера, вам придется изменить их размер до заданного размера. Один из способов сделать это, если у вас есть Toolbox для обработки изображений , это использовать функцию IMRESIZE :

newSize = [40 40];        %# The new size the image will be
C = imresize(B,newSize);  %# Resize image B

Если у вас нет доступа к панели инструментов обработки изображений, можно использовать функцию INTERP2 для изменения размера изображения. Вот один пример изменения размера 3-D RGB-изображения типа UINT8 :

B = double(B);                   %# Convert B to double (needed to use INTERP2)
[nRows,nCols,nDepth] = size(B);  %# Get the old image size
C = zeros(40,40,3,'uint8');      %# Initialize the new 3-D 40-by-40 uint8 image
xi = linspace(1,nCols,40);       %# Create a down-sampled set of x points
yi = linspace(1,nRows,40);       %# Create a down-sampled set of y points
[X,Y] = meshgrid(xi,yi);         %# Create 40-by-40 grids of x and y points
C(:,:,1) = interp2(B(:,:,1),X,Y,'spline');  %# Interpolate the red color plane
C(:,:,2) = interp2(B(:,:,2),X,Y,'spline');  %# Interpolate the green color plane
C(:,:,3) = interp2(B(:,:,3),X,Y,'spline');  %# Interpolate the blue color plane

Изображение C теперь будет уменьшенной выборкой 40 * 40 B.

Пример # 2: массив ячеек ...

nImages = 5;  %# The number of images you will use
Train_Dat = cell(1,nImages);  %# Initialize the cell array
Train_Dat{1} = B;             %# Assign B as the first image

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

...