声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3507|回复: 11

[综合讨论] 问一下矩阵分割和分别输出的问题

[复制链接]
发表于 2011-5-16 13:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
比如我有一个100*100的矩阵,想分割成4*4的小矩阵,然后单独输出没个小矩阵文档TXT,在单独输出的文档中,要包括X,Y坐标。
a=rand(100,100);
for m=0:24
  for  n=0:24
b(m,n)=a(m*4:(m+1)*4,n*4:(n+1)*4);
end
end
不知道哪儿错了,后面还想输出25*25个TXT文档,其中要包含有原来的XY坐标
回复
分享到:

使用道具 举报

发表于 2011-5-16 14:55 | 显示全部楼层
楼主直接用角标+冒号操作就可以实现你的要求吧。
看楼主的程序里,有b(0,0)这项,matlab中矩阵的默认开始好像是1吧!
 楼主| 发表于 2011-5-16 15:12 | 显示全部楼层
本帖最后由 fanzhenjie 于 2011-5-16 15:19 编辑

回复 2 # meiyongyuandeze 的帖子

恩,我改了一下,还是不行:
a=rand(100,100);
for m=1:25
  for  n=1:25
b(m,n)=a(m*4-3:m*4,n*4-3:n*4);%改为b=a(m*4-3:m*4,n*4-3:n*4)只输出了最后一个小矩阵
end
end
这样改了还是不行呀,我还想把每个小矩阵带并包括原来XY坐标值用TXT文档分别输出,就是输出很多不同文件名的TXT文档,每个文档中包括每个小矩阵中对应的矩阵值及原来a中的横竖坐标值,就是相当于最初矩阵a表示一个比较大的平面,分割成小块小块的小面元后,每个小面元再重新用TXT文档输出,
发表于 2011-5-16 23:10 | 显示全部楼层
回复 3 # fanzhenjie 的帖子

按照自己的理解写了下
  1. a=rand(100,100);
  2. >> b=mat2cell(a,4*ones(1,25),4*ones(1,25));
  3. >> b{1,1}
  4. ans =
  5.     0.0226    0.0579    0.1089    0.8229
  6.     0.9235    0.7603    0.1709    0.3578
  7.     0.2202    0.6035    0.4224    0.1886
  8.     0.6964    0.1513    0.9241    0.8661
  9. >> b{1,2}
  10. ans =
  11.     0.1608    0.2470    0.4090    0.1109
  12.     0.9698    0.4888    0.9847    0.0251
  13.     0.7053    0.6909    0.4901    0.5955
  14.     0.5526    0.8640    0.3462    0.4890
复制代码
上面生成b是25*25的一个矩阵,应该是要的矩阵吧,自己是这么理解。
具体的你可以参见 help mat2cell

评分

1

查看全部评分

发表于 2011-5-17 11:04 | 显示全部楼层
回复 1 # fanzhenjie 的帖子

这个问题不难,用下面讲师的方法是可以实现的,但是请你把具体写成什么样的文件格式描述清楚,大家才可以帮助你啊
 楼主| 发表于 2011-5-17 11:20 | 显示全部楼层
回复 4 # meiyongyuandeze 的帖子

我自己写了一下,把100*100分成10*10的100小矩阵,输出时要输出对应原来的坐标点,相当于每行代表X,Y,Z坐标,我不知到哪儿错了
c=rand(100,100);
for i=1:10
for j=1:10
[a,b]=meshgrid(i*10-9:i*10,j*10-9:j*10)
results=[a,b,c(i*10-9:i*10,j*10-9:j*10)];
fid=fopen(strcat('fan_',num2str(i),'_',num2str(j),'.txt'),'a');
fprintf(fid,'%5.3f %5.3f %5.3e \n',results);
fclose(fid);
end
end
 楼主| 发表于 2011-5-17 14:17 | 显示全部楼层

我最后得到的每个TXT文档都是三列数据,第一列表面原来的横坐标,第二列表示原来的纵坐标,第三列表示原来的值,相当于一个点的,XYZ坐标,嘿嘿!但不知道怎么操作!
发表于 2011-5-17 14:56 | 显示全部楼层
回复 6 # fanzhenjie 的帖子
  1. function matr = matrixDispose(n)
  2. if nargin == 0
  3.     n = 10;
  4. end
  5. [matr{1:2}] = meshgrid(1:n*n); % 生成位置
  6. matr{3} = rand(n*n);           % 生成数据
  7. [I,J] = ind2sub([n,n],1:n*n);
  8. prematr = cellfun(@(x)mat2cell(x,n+zeros(1,n),n+zeros(1,n)),matr,'Uni',0);
  9. arrayfun(@(x)saveTxt(I(x),J(x),...
  10.     [prematr{2}{x}(:),prematr{1}{x}(:),prematr{3}{x}(:)]'),1:n*n);
  11. function saveTxt(i,j,results)
  12. fid=fopen(sprintf('fan_%d_%d.txt',i,j),'a');
  13. fprintf(fid,'%5.3f %5.3f %5.3e \n',results);
  14. fclose(fid);
复制代码
这段代码应该可以实现的

评分

1

查看全部评分

 楼主| 发表于 2011-5-17 15:35 | 显示全部楼层
回复 8 # qibbxxt 的帖子

十分感谢,我试试呀!
 楼主| 发表于 2011-5-17 15:40 | 显示全部楼层
您好,我用下面程序如单独输出可以弄Z值就是正确的,想把原来对应的,XY坐标都添加进去然后分别输出,即,TXT文档中都是n行三列的那种,不知道哪儿写的有问题呀!
c=rand(100,100);
for i=1:10
for j=1:10
[a,b]=meshgrid(i*10-9:i*10,j*10-9:j*10);%这行应该有错吧
results=[a,b,c(i*10-9:i*10,j*10-9:j*10)];%这行不知道如何把对应的XY也写进去,然后输出
fid=fopen(strcat('fan_',num2str(i),'_',num2str(j),'.txt'),'a');
fprintf(fid,'%5.3f %5.3f %5.3e \n',results);
fclose(fid);
end
end
发表于 2011-5-17 16:39 | 显示全部楼层
回复 10 # fanzhenjie 的帖子
  1. c=rand(100,100);
  2. for i=1:10
  3.     for j=1:10
  4.         [a,b]=meshgrid(i*10-9:i*10,j*10-9:j*10);%这行应该有错吧
  5.         results=[b(:),a(:),reshape(c(i*10-9:i*10,j*10-9:j*10),[],1)]';%这行不知道如何把对应的XY也写进去,然后输出
  6.         fid=fopen(strcat('fan_',num2str(i),'_',num2str(j),'.txt'),'a');
  7.         fprintf(fid,'%5.3f %5.3f %5.3e \n',results);
  8.         fclose(fid);
  9.     end
  10. end
复制代码

评分

1

查看全部评分

 楼主| 发表于 2011-5-18 16:20 | 显示全部楼层
回复 11 # qibbxxt 的帖子

明白了,十分感谢呀
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-18 11:39 , Processed in 0.120966 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表