我是MATLAB及其开发的新手。我的图像是1134(行)X 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));
错误:
使用mat2cell出错(第97行) 输入参数D1到D2必须与输入矩阵大小的每个维度相加[1 1285956]。'
答案 0 :(得分:3)
不幸的是,您的代码无法正常工作。
./
运算符执行两个矩阵的逐点划分。简短的例子:
[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。
希望有所帮助:)
答案 1 :(得分:1)
在C=A./B
命令后面循环遍历A(ii,jj,...)
和B(ii,jj,..)
以及每个C(ii,jj,..)=A(ii,jj,...)/B(ii,jj,...)
的所有元素。
因此,广告A
和B
必须具有相同的维度。
如果要将矩阵拆分为组,可以使用
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
代码为结果子矩阵和任意计数器sc
和kk
分配单元数组ll
。然后它循环遍历ii
和jj
,步长为3,表示每个子矩阵的中心。
修改强>
或者你可以使用mat2cell
命令(在matlab shell中输入help mat2cell
或doc mat2cell
)
sc=mat2cell(image,3,3);
在这两种情况下,结果都是单元格数组,ii
可以访问其jj
和sc{ii,jj}
元素(矩阵)。如果您想在ii
和jj
矩阵中拨打kk
个ll
号码,请通过sc{kk,ll}(ii,jj)
进行操作。
答案 2 :(得分:1)
简而言之,您将1134 x 1134除以2 x 1矩阵。这不起作用。
错误“Matrix dimension must agree **”来自将矩阵与另一个没有正确尺寸的矩阵分开。
你使用标量除以“./”将矩阵除以另一个矩阵。
你想要这样的东西:
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);
你可以做一个很好的循环,但有时思考很难。