2016-04-12 12 views
0

私はMATLABとその開発が初めてです。私は1134(行)×1134(列)のイメージを持っています。私は3(列)X 3(行)を保存する画像をしたい。そのためには378個の細胞が必要です。そのために私は次のコードを使用しましたが、それは私にエラーを与えます。大きな画像マトリックス:小さなマトリックスに保存

image=imread('C:\Users\ven\Desktop\test\depth.png'); 
    I=reshape(image,1,1134*1134); 
    chunk_size = [3 3]; % your desired size of the chunks image is broken into 
    sc = sz ./ chunk_size; % number of chunks in each dimension; must be integer 

    % split to chunk_size(1) by chunk_size(2) chunks 
    X = mat2cell(I, chunk_size(1) * ones(sc(1),1), chunk_size(2) *ones(sc(2),1)); 

エラー:あなたはそれはと思うよう

Error using mat2cell (line 97) Input arguments, D1 through D2, must sum to each dimension of the input matrix size, [1 1285956].'

+0

このコードで何を期待していましたか? '。/'は要素ごとの除算演算子です。それは、LHSの各要素をRHS上の対応する*要素で分割しようとします。ここでのキーワードは対応しています。つまり、2つの行列*は同じ数の要素と同じ形を持たなければなりません。私はあなたのコードが、あなたが描いていることに近づくことさえできないのではないかと心配しています。 http://www.mathworks.com/help/matlab/matlab_prog/array-vs-matrix-operations.htmlと[./'のドキュメント(http://www.mathworks.com)を読むことをお勧めしますか? /help/fixedpoint/ref/rdivide.html)と基本的なチュートリアルです。 – Dan

答えて

1

A(ii,jj,...)B(ii,jj,..)と各C(ii,jj,..)=A(ii,jj,...)/B(ii,jj,...)のすべての要素をループです。

したがって、ABは同じ寸法でなければなりません。あなたがグループに行列を分割したい場合は

あなたはコードが部分行列と、任意のカウンターkkllの結果のためにセル配列scを割り当て

sc=cell(1134/3,1); 
kk=0;ll=0; 
for ii=2:3:1133 
kk=kk+1; 
for jj=2:3:1133 
    ll=ll+1; 
    sc{kk,ll}=image(ii-1:ii+1,jj-1:jj+1); 
end 
end 

使用することができます。次に、iijjをループさせ、各サブマトリックスの中心を表す3のステップを行います。


編集

それとも、どちらの場合も結果はセルアレイとそのii番目であるmat2cellコマンド(タイプhelp mat2cellまたはdoc mat2cell MATLABのシェルで)

sc=mat2cell(image,3,3); 

を使用することができますおよびjj番目の要素(行列)はsc{ii,jj}iijj番目の番号をkk番目とll番目の行列に指定する場合は、sc{kk,ll}(ii,jj)で行います。

+0

または単に 'mat2cell'を使用してください... – Dan

+0

@Dan Indeed。私は原始的なコーダーです。 – Crowley

+0

@Crowleyあなたはii = 2:3:1133、私がii = 2:3を知っていることをすべて教えてください。 –

3

残念ながら、あなたのコードが動作しません。

./演算子は、2つの行列のポイントワイズ除算を実行します。短い例:

[12, 8] ./ [4, 2] == [12/4, 8/2] == [3, 4] 

両方の行列が正確に同じサイズでなければなりません。あなたの場合、1134x1134行列(イメージ)と1x2行列(chunk_size)でこのような操作を実行しようとします。

つまり、行列を小さなものに分割することはできません。

ただし、問題の解決方法は、mat2cell関数を使用して行列のサブセットを選択することです。それがどのように行われたかの説明は、ここにあります(例を含む):http://se.mathworks.com/matlabcentral/answers/89757-how-to-divide-256x256-matrix-into-sixteen-16x16-blocks

はそれが役に立てば幸い:) C=A./Bコマンドの後ろ

+1

リンクが一日壊れた場合は、解答の要点(例えば、 'mat2cell'を使用してください)もあなたの答えに組み込むことをお勧めします。 – Dan

+0

@ rasan076私はそれを得た。私はすでにあなたの答えに投票しました。しかし、今私は自分の疑問を広げた。私が学んだことと一緒に。あなたは私の質問を見てみることができますか?私はどこで間違っているのか確認したい。ありがとうございました。 –

+2

@VenSanしないでください。あなたが学んだことに基づいて新しい質問がある場合は、新しい質問としてそれを聞いてください。 – Dan

1

要するに、1134 x 1134を2 x 1マトリックスで分割しました。それは動作しません。

「行列の寸法は一致する必要があります**」というエラーは、適切な次元を持たない別の行列で行列を除算したものです。

別のマトリックスでマトリックスを分割したスカラーの分割「./」を使用しました。 がhttp://au.mathworks.com/matlabcentral/answers/46699-how-to-segment-divide-an-image-into-4-equal-halves

あなたはそれを行うことができます素敵なループがあるでしょうが、時には思考は難しいです。ここから

n = 1134/3   % you should measure the length of the image 
I1=image(1:n,1:n); % first row 
I2=image(1:n,n:2n); 
I3=image(1:n,2n:3n); 
I4=image(n:2n,1:n); % second row 
I5=image(n:2n,n:2n); 
I6=image(n:2n,2n:3n); 
I7=image(2n:3n,1:n); % third row 
I8=image(2n:3n,n:2n); 
I9=image(2n:3n,2n:3n); 

はあなたのような何かをしたいです。

+0

少なくとも、これらの変数すべてでワークスペースを乱雑にするのではなく、セル配列を使用してください。また、OPは* 3 * -by- * 3 *行列を必要とし、3つの行列に分割しないので、そこに 'n 'に行く必要があります。 – Dan

+0

ええ、それは作業空間を乱雑にする粗い解決策です変数付き。あなたが正しいです。しかし、Venは最初に配列を使う方法を知らなかった。だから彼を助けるかもしれない。私は彼が3つの配列として、1つの配列の内側にある9つの配列を扱うのが嫌です。彼は2D配列と1D配列で苦労しています。そのようにして、私は原油が良いと思う。 「n」までは1134までを意味しますか? 3n = 1134 –

+1

'n'は' 1134/3'ですが、実際に 'n^2'に' 142884'まで上がっていなければなりません。ソリューションは選択肢でもありません。私がOPを誤解しない限り、質問は非常にあいまいです。どちらの方法でも、このソリューションは決して使用しないでください。セル配列はMATLABの基本構造であり、その言語を使用するすべての人は、その使用法を学ぶ必要があります。 – Dan