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]);

誰かが私を助けて、このエラーを修正して克服するために私を導くことができますか?

4

1 に答える 1

1

やったほうがいい:

[n m] = size(out1); 

fr1行しかないので、out1かなりの数です。

ただし、次を使用してリマッティングをスキップすることもできますbsxfun()

B = bsxfun(@rdivide, bsxfun(@minus,out1,AMean), AStd);
于 2013-05-16T20:20:54.527 に答える