找回密码
 注册
Simdroid-非首页
查看: 267|回复: 7

矩阵成倍扩展问题

[复制链接]
发表于 2011-3-16 22:40:16 | 显示全部楼层 |阅读模式 来自 江苏南京
本帖最后由 scott198510 于 2011-3-16 23:14 编辑

比如如下矩阵
A =
     2     3     4      5
     6     7     8      9
    10    11    12    13
    14    15    16    17

现在要把矩阵每一行的元素扩展为两行,每一列的元素也扩展为两列,扩展后的矩阵如下:
B =
     2      2      3     3       4      4     5           5
     2      2      3     3       4      4     5           5
     6      6      7     7       8      8     9           9
     6      6      7     7       8      8     9           9
    10    10    11    11    12    12    13         13
    10    10    11    11    12    12    13        13
    14    14    15    15    16    16    17        17
    14    14    15    15    16    16    17        17

然后将矩阵B矩阵变成这样的一个矩阵:
C=2      2      3      3      4      4      5     5     [  ]
     2     2      3      3      4      4      5     5      [  ]
     [ ]    6      6      7      7      8      8     9      9
     [ ]    6      6      7      7      8      8     9      9
    10    10    11    11    12    12    13    13    [ ]
    10    10    11    11    12    12    13    13    [ ]
    [ ]    14    14    15    15    16    16    17    17
    [ ]    14    14    15    15    16    16    17    17
也就是对于原来矩阵A里面的元素,位于偶数行的开头的元素就向右边错动一列,同时把第一列补为空格,奇数行没有右错动的就在右边补空格,保证变换后的矩阵的维数正确,由于实际矩阵维数很大,哪位大虾看看怎么用算法实现呢?
发表于 2011-3-17 06:18:28 | 显示全部楼层 来自 辽宁葫芦岛
Simdroid开发平台
只能用cell了 然后行列分别复制
回复 不支持

使用道具 举报

发表于 2011-3-17 08:38:18 | 显示全部楼层 来自 河北廊坊
1# scott198510

  1. clear;clc;close all
  2. N = 4;
  3. A = reshape(2:17,N,[])';
  4. B = kron(A,ones(2));
  5. C = [B,zeros(N*2,1)+NaN];
  6. for i = 2*2-1:4:2*N
  7.     C(i:i+1,:)=circshift(C(i:i+1,:),[0 1]);
  8. end
  9. A,B,C
复制代码


  1. A =
  2.      2     3     4     5
  3.      6     7     8     9
  4.     10    11    12    13
  5.     14    15    16    17

  6. B =
  7.      2     2     3     3     4     4     5     5
  8.      2     2     3     3     4     4     5     5
  9.      6     6     7     7     8     8     9     9
  10.      6     6     7     7     8     8     9     9
  11.     10    10    11    11    12    12    13    13
  12.     10    10    11    11    12    12    13    13
  13.     14    14    15    15    16    16    17    17
  14.     14    14    15    15    16    16    17    17

  15. C =
  16.      2     2     3     3     4     4     5     5   NaN
  17.      2     2     3     3     4     4     5     5   NaN
  18.    NaN     6     6     7     7     8     8     9     9
  19.    NaN     6     6     7     7     8     8     9     9
  20.     10    10    11    11    12    12    13    13   NaN
  21.     10    10    11    11    12    12    13    13   NaN
  22.    NaN    14    14    15    15    16    16    17    17
  23.    NaN    14    14    15    15    16    16    17    17
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-3-17 21:21:55 | 显示全部楼层 来自 江苏南京
3# qibbxxt
版主的函数确实炉火纯青,这两个函数都没用过,
如果是是错动成这种效果呢:
11223344
11223344
  qqwweerr
  qqwweerr
    zzxxccvv
    zzxxccvv

即从原有矩阵第二行开始逐行错动(新矩阵是两行两行的错动)右边补空位,原来的矩阵NXN 变为2NX 3N-1
回复 不支持

使用道具 举报

发表于 2011-3-18 09:24:30 | 显示全部楼层 来自 河北廊坊
4# scott198510
具体的位置你去控制吧,我给你一个例子

  1. A0 = {1,2,3,4,NaN;'q','w','e','r',NaN;'z','x','c','v',NaN};
  2. A = reshape(1:numel(A0),size(A0));
  3. N = size(A,1);
  4. B = kron(A,ones(2));
  5. for i = 1:2:size(B)
  6.     B(i:i+1,:)=circshift(B(i:i+1,:),[0 (i-1)/2]);
  7. end
  8. C = A0(B);
  9. [C{arrayfun(@(x)isnan(C{x}),1:numel(C))}]=...
  10.     deal(feval(@(x)x{:},cell(size(A0,1)*4,1)))
复制代码


  1. C =
  2.     [1]    [1]    [2]    [2]    [3]    [3]    [4]    [4]     []     []
  3.     [1]    [1]    [2]    [2]    [3]    [3]    [4]    [4]     []     []
  4.      []    'q'    'q'    'w'    'w'    'e'    'e'    'r'    'r'     []
  5.      []    'q'    'q'    'w'    'w'    'e'    'e'    'r'    'r'     []
  6.      []     []    'z'    'z'    'x'    'x'    'c'    'c'    'v'    'v'
  7.      []     []    'z'    'z'    'x'    'x'    'c'    'c'    'v'    'v'
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2011-3-18 13:24:20 | 显示全部楼层 来自 河北廊坊
7# scott198510
我用的是2010b的版本,运行没有警告的
颜色方面的话,你得看相关的书籍或者网上找找
回复 不支持

使用道具 举报

发表于 2011-3-22 09:51:52 | 显示全部楼层 来自 山东烟台
本帖最后由 liuyalong008 于 2011-3-22 09:53 编辑

9# scott198510

最近由于考博论文太忙了,不好意思,不打算在QQ回你是由于想让大家指正,不要老用imagesc,你还不如用image然后设置cdatamapping属性为 scaled,这样虽然麻烦但是对你非常有好处,
用pcolor或者surface,surf等可以显示,不一定非要image,imshow

显式的时候  顺便设置一下linestyle属性就行

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

 楼主| 发表于 2011-5-1 19:27:38 | 显示全部楼层 来自 江苏南京
% 分别用surf 和pcolor 函数搞定了边上白色的要求:

C=flipdim(C,1);
figure ; pcolor(C);
shading interp
set(gca,'box','off')
set(gcf,'color','w');
axis off

figure; surf(C);
shading interp
az =0;
el =90;
view(az, el);
set(gca,'box','off')
set(gcf,'color','w');
axis off

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-28 02:08 , Processed in 0.056125 second(s), 20 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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