2013-05-16 53 views
0

我是MATLAB的初學者。我創建了一個讀取類型爲JPG(相同文件類型)但每個文件的大小不同的數據集文件的代碼。我所做的是隨機讀取10個文件,並將這些文件的內容放入一個名爲'fr'的矩陣(帶有單元格數組的類型)中(如下所示)。這個'fr'包含10列,這意味着10個文件被讀取。我提取(讀取)的文件的內容是二進制文件字節(0-255)但是,我提取了每個文件的內容並將它們放入一個名爲'out1'的變量,但問題是如何使用不同的文件訪問這些內容每個文件的大小,我已經通過使用函數(cellfun)解決了它,我通過添加零填充空白單元格。 最終,矩陣起作用了,但我現在面臨的問題是如何從讀取的整個文件中減去這個矩陣'out1'?我被困在這一部分。這個錯誤說矩陣尺寸必須一致:正如最後解釋的那樣。如何解決矩陣尺寸的協議

這是輸出: ???錯誤使用==>減去 矩陣尺寸必須一致。

Error in ==> PCATEST2 at 50 
B = (out1 - repmat(AMean,[n 1]))/repmat(AStd,[n 1]); 

EDU>> whos 
    Name    Size    Bytes Class  Attributes 

    AMean    1x10     80 double    
    AStd    1x10     80 double    
    ans     1x1     8 double    
    f     1x57    114 char     
    fid     1x1     8 double    
    files    50x1    32870 struct    
    fr     1x10   6715472 cell     
    i     1x1     8 double    
    j     1x1     8 double    
    m     1x1     8 double    
    maxLength   1x1     8 double    
    n     1x1     8 double    
    out1   101077x10   8086160 double    
    ridx    50x1     400 double    
    st1     1x10    1460 cell 

此代碼:

f ='/Users/nsa/Documents/MATLAB/jpg-data1/'; 
files = dir(fullfile(f,'*.jpg')); 
ridx = randi(numel(files),size(files)); %choose files from f randomly 

for i = 1:10 %randomly pick 10 files 
st1(i) = {files(ridx(i)).name}; 

    for j= i:length(st1) 

    fid = fopen(fullfile(f, st1{i}),'rt'); 

    fr{j} = fread(fullfile(fid)); 

    fclose(fid); 

end 

end 
maxLength=max(cellfun(@(fr)numel(fr),fr)); 
out1 = cell2mat(cellfun(@(fr)cat(1,fr,zeros(maxLength-length(fr),1)),fr,'UniformOutput',false)); 

[n m] = size(fr); 

AMean = cellfun(@mean,fr); 

AStd = cellfun(@std,fr); 

B = (out1 - repmat(AMean,[n 1]))/repmat(AStd,[n 1]); 


??? Error using ==> minus 
Matrix dimensions must agree. 

Error in ==> TEST2 at 50 
B = (out1 - repmat(AMean,[n 1]))/repmat(AStd,[n 1]); 

誰能幫助我,引導我解決和克服這種錯誤?

+0

你可以複製並粘貼運行'whos'的輸出? – JesseBikman

+0

輸出字符太長。我會把它分成幾部分。 – user2341531

+0

我只是把問題的開頭的輸出 – user2341531

回答

1

你應該這樣做:

[n m] = size(out1); 

因爲fr只有1行out1不少。

但是,你甚至可以通過使用bsxfun()跳過repmatting:

B = bsxfun(@rdivide, bsxfun(@minus,out1,AMean), AStd); 
+1

非常感謝。它完美的作品。 – user2341531