2013-05-16 20 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