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

想问一下三个分页矩阵合为一个矩阵的程序实现方法(已解决)

[复制链接]
发表于 2010-12-13 09:05:27 | 显示全部楼层 |阅读模式 来自 台湾
本帖最后由 武神裝攻 于 2010-12-13 09:16 编辑

不好意思 小弟在矩阵上又遇上了一个有趣的问题
想问板上各位英雄们帮实现程序 在此先感激各位并谢谢

以下是单一页案例
小弟三有个矩阵A、B、C,希望求D
A = [2  6  4  8;              % 1
       5  7  8  2;              % 2
       1  5  6  4];             % 3
B = [4  8  7  4;              % 1
       7  8  2  6;              % 2
       3  2  5  5];             % 3
C = [8  4  1  1;             % 1
       6  9  5  4;              % 2
       7  7  8  9];             % 3
A、B、C都是3*4大矩阵,所以合并的D是(3*3)*(3*4)=9*12大的矩阵
              A    B     C
D = A  [  A    0     0
       B     0    B     0
       C     0    0     C
所以D最后会得到的答案是
D= [2     0      0      6      0      0      4      0      0      8      0      0;                       % 1
      0      4      0      0      8      0      0      7      0      0      4      0;                       % 1
      0      0      8      0      0      4      0      0      1      0      0      1;                       % 1
      5      0      0      7      0      0      8      0      0      2      0      0;                       % 2
      0      7      0      0      8      0      0      2      0      0      6      0;                       % 2
      0      0      6      0      0      9      0      0      5      0      0      4;                       % 2
      1      0      0      5      0      0      6      0      0      4      0      0;                       % 3
      0      3      0      0      2      0      0      5      0      0      5      0;                       % 3
      0      0      7      0      0      7      0      0      8      0      0      9];                      % 3
程序:
clear all
A = [2  6  4  8;              % 1
       5  7  8  2;              % 2
       1  5  6  4];             % 3
B = [4  8  7  4;              % 1
       7  8  2  6;              % 2
       3  2  5  5];             % 3
C = [8  4  1  1;             % 1
       6  9  5  4;              % 2
       7  7  8  9];             % 3
T_A=kron(A,[1;0;0]);
T_B=kron(B,[1;0;0]);
T_B=circshift(T_B,1);
T_C=kron(C,[1;0;0]);
T_C=circshift(T_C,2);
D=reshape([T_A;T_B;T_C],size(T_A,1),[])

现在假设 ABC有分页 例
A(:,:,1) = [2  6  4  8;              % 1
                5  7  8  2;              % 2
                1  5  6  4];             % 3
A(:,:,2) = [4  8  7  4;              % 1
                5  7  8  2;              % 2
                1  5  6  4];             % 3
A(:,:,3) = [8  4  1  1;              % 1
                5  7  8  2;              % 2
                1  5  6  4];             % 3
B(:,:,1) = [4  8  7  4;              % 1
                7  8  2  6;              % 2
                3  2  5  5];             % 3
B(:,:,2) = [2  6  4  8;              % 1
                7  8  2  6;              % 2
                3  2  5  5];             % 3
B(:,:,3) = [8  4  1  1;              % 1
                7  8  2  6;              % 2
                3  2  5  5];             % 3
C(:,:,1) = [8  4  1  1;              % 1
                6  9  5  4;              % 2
                7  7  8  9];             % 3
C(:,:,2) = [2  6  4  8;              % 1
                6  9  5  4;              % 2
                7  7  8  9];             % 3
C(:,:,3) = [4  8  7  4;              % 1
                6  9  5  4;              % 2
                7  7  8  9];             % 3

请问要如何更改求D=
D(:,:,1)= [2     0      0      6      0      0      4      0      0      8      0      0;                     
                0      4      0      0      8      0      0      7      0      0      4      0;                       
                0      0      8      0      0      4      0      0      1      0      0      1;                    
                5      0      0      7      0      0      8      0      0      2      0      0;                      
                0      7      0      0      8      0      0      2      0      0      6      0;                     
                0      0      6      0      0      9      0      0      5      0      0      4;                       
                1      0      0      5      0      0      6      0      0      4      0      0;                       
                0      3      0      0      2      0      0      5      0      0      5      0;                       
                0      0      7      0      0      7      0      0      8      0      0      9];        
D(:,:,2)= [ 4     0      0      8      0      0      7      0      0      4      0      0;                     
                0      2      0      0      6      0      0      4      0      0      8      0;                       
                0      0      2      0      0      6      0      0      4      0      0      8;                    
                5      0      0      7      0      0      8      0      0      2      0      0;                      
                0      7      0      0      8      0      0      2      0      0      6      0;                     
                0      0      6      0      0      9      0      0      5      0      0      4;                       
                1      0      0      5      0      0      6      0      0      4      0      0;                       
                0      3      0      0      2      0      0      5      0      0      5      0;                       
                0      0      7      0      0      7      0      0      8      0      0      9];               

D(:,:,3)= [8     0      0      4      0      0      1      0      0      1      0      0;                     
                0      8      0      0      4      0      0      1      0      0      1      0;                       
                0      0      4      0      0      8      0      0      7      0      0      4;                    
                5      0      0      7      0      0      8      0      0      2      0      0;                      
                0      7      0      0      8      0      0      2      0      0      6      0;                     
                0      0      6      0      0      9      0      0      5      0      0      4;                       
                1      0      0      5      0      0      6      0      0      4      0      0;                       
                0      3      0      0      2      0      0      5      0      0      5      0;                       
                0      0      7      0      0      7      0      0      8      0      0      9];   

刚想到不好意思 谢谢
for b = 1:3        
T_A(:,:,b) = kron(A(:,:,b),[1;0;0]);
T_B(:,:,b) = kron(B(:,:,b),[1;0;0]);
T_C(:,:,b) = kron(C(:,:,b),[1;0;0]);
T_D(:,:,b) = circshift(T_B(:,:,b),1);
T_E(:,:,b) = circshift(T_C(:,:,b),2);
D(:,:,b) = reshape([T_A(:,:,b);T_D(:,:,b);T_E(:,:,b)],size(T_A,1),[]);
end

评分

1

查看全部评分

发表于 2010-12-13 10:44:26 | 显示全部楼层 来自 河北廊坊
Simdroid开发平台
1# 武神裝攻
1# 武神裝攻
lz的编程思想的确是不错的,感谢你分享,在此我用kron实现了2维的情况

  1. clear all;clc;
  2. a = [2  6  4  8;              % 1
  3.     5  7  8  2;              % 2
  4.     1  5  6  4];             % 3
  5. b = [4  8  7  4;              % 1
  6.     7  8  2  6;              % 2
  7.     3  2  5  5];             % 3
  8. c = [8  4  1  1;             % 1
  9.     6  9  5  4;              % 2
  10.     7  7  8  9];             % 3
  11. d={a,b,c};
  12. e=eye(length(d));
  13. f=sum(cell2mat(reshape(arrayfun(@(x)kron(d{x},diag(e(x,:))),1:length(d),'UniformOutput',false),[1,1,length(d)])),3);
复制代码

运行结果

  1. f =
  2.      2     0     0     6     0     0     4     0     0     8     0     0
  3.      0     4     0     0     8     0     0     7     0     0     4     0
  4.      0     0     8     0     0     4     0     0     1     0     0     1
  5.      5     0     0     7     0     0     8     0     0     2     0     0
  6.      0     7     0     0     8     0     0     2     0     0     6     0
  7.      0     0     6     0     0     9     0     0     5     0     0     4
  8.      1     0     0     5     0     0     6     0     0     4     0     0
  9.      0     3     0     0     2     0     0     5     0     0     5     0
  10.      0     0     7     0     0     7     0     0     8     0     0     9

复制代码

本来尝试用kron做3维,但是kron不支持3维的操作,所以用arrayfun来实现

  1. clear;clc;close all
  2. A(:,:,1) = [2  6  4  8;              % 1
  3.     5  7  8  2;              % 2
  4.     1  5  6  4];             % 3
  5. A(:,:,2) = [4  8  7  4;              % 1
  6.     5  7  8  2;              % 2
  7.     1  5  6  4];             % 3
  8. A(:,:,3) = [8  4  1  1;              % 1
  9.     5  7  8  2;              % 2
  10.     1  5  6  4];             % 3
  11. B(:,:,1) = [4  8  7  4;              % 1
  12.     7  8  2  6;              % 2
  13.     3  2  5  5];             % 3
  14. B(:,:,2) = [2  6  4  8;              % 1
  15.     7  8  2  6;              % 2
  16.     3  2  5  5];             % 3
  17. B(:,:,3) = [8  4  1  1;              % 1
  18.     7  8  2  6;              % 2
  19.     3  2  5  5];             % 3
  20. C(:,:,1) = [8  4  1  1;              % 1
  21.     6  9  5  4;              % 2
  22.     7  7  8  9];             % 3
  23. C(:,:,2) = [2  6  4  8;              % 1
  24.     6  9  5  4;              % 2
  25.     7  7  8  9];             % 3
  26. C(:,:,3) = [4  8  7  4;              % 1
  27.     6  9  5  4;              % 2
  28.     7  7  8  9];             % 3
  29. d={A,B,C};
  30. e=eye(length(d));
  31. D=reshape(cell2mat(arrayfun(@(y)sum(cell2mat(reshape(arrayfun(@(x)kron(d{x}(:,:,y),diag(e(x,:))),1:length(d),'UniformOutput',false),[1,1,length(d)])),3),1:size(A,3),'UniformOutput',false)),size(A,1)*length(d),size(A,2)*length(d),[]);

复制代码

运行结果如下

本帖子中包含更多资源

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

×

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-27 11:49:32 | 显示全部楼层 来自 北京
本帖最后由 rocwoods 于 2010-12-27 13:11 编辑

我也给出一种方法

  1. a = [2  6  4  8;              % 1
  2. 5  7  8  2;              % 2
  3. 1  5  6  4];             % 3
  4. b = [4  8  7  4;              % 1
  5. 7  8  2  6;              % 2
  6. 3  2  5  5];             % 3
  7. c = [8  4  1  1;             % 1
  8. 6  9  5  4;              % 2
  9. 7  7  8  9];             % 3
  10. AA = [a;b;c];
  11. [nrows,ncols] = size(a);
  12. ind = repmat([3;3;4;3;3;4;3;3;1],ncols,1);
  13. D = zeros(3*size(a,1),3*size(a,2));
  14. ind = cumsum([1;ind]);
  15. D(ind(1:end-1)) = AA(:);
复制代码
三种方法时间对比:

  1. >> tic;
  2. for k = 1:10000
  3. d={a,b,c};
  4. e=eye(length(d));
  5. f=sum(cell2mat(reshape(arrayfun(@(x)kron(d{x},diag(e(x,:))),1:length(d),'UniformOutput',false),[1,1,length(d)])),3);
  6. end
  7. toc
  8. tic;
  9. for k = 1:10000;
  10. AA = [a;b;c];
  11. [nrows,ncols] = size(a);
  12. ind = repmat([3;3;4;3;3;4;3;3;1],ncols,1);
  13. D = zeros(3*size(a,1),3*size(a,2));
  14. ind = cumsum([1;ind]);
  15. D(ind(1:end-1)) = AA(:);
  16. end;toc
  17. isequal(f,D)
  18. tic;for k = 1:10000
  19. T_A=kron(a,[1;0;0]);
  20. T_B=kron(b,[1;0;0]);
  21. T_B=circshift(T_B,1);
  22. T_C=kron(c,[1;0;0]);
  23. T_C=circshift(T_C,2);
  24. D=reshape([T_A;T_B;T_C],size(T_A,1),[]);end;toc
  25. Elapsed time is 6.678037 seconds.
  26. Elapsed time is 0.747954 seconds.
  27. ans =
  28.      1
  29. Elapsed time is 3.273866 seconds.
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-27 14:35:41 | 显示全部楼层 来自 河北廊坊
从效率角度出发,我改进下
第一种:不用arrayfun,改为加法,小数据量可用
  1. clear;clc;close all
  2. tic;
  3. a = [2 6 4 8; % 1
  4. 5 7 8 2; % 2
  5. 1 5 6 4]; % 3
  6. b = [4 8 7 4; % 1
  7. 7 8 2 6; % 2
  8. 3 2 5 5]; % 3
  9. c = [8 4 1 1; % 1
  10. 6 9 5 4; % 2
  11. 7 7 8 9]; % 3
  12. D=kron(a,[1 0 0;0 0 0;0 0 0])+kron(b,[0 0 0;0 1 0;0 0 0])+kron(c,[0 0 0;0 1 0;0 0 0]);
  13. toc
复制代码

  1. Elapsed time is 0.000204 seconds.
复制代码

第二种:对吴兄的程序用双角标

  1. clear;clc;close all
  2. tic;
  3. a = [2  6  4  8;              % 1
  4. 5  7  8  2;              % 2
  5. 1  5  6  4];             % 3
  6. b = [4  8  7  4;              % 1
  7. 7  8  2  6;              % 2
  8. 3  2  5  5];             % 3
  9. c = [8  4  1  1;             % 1
  10. 6  9  5  4;              % 2
  11. 7  7  8  9];             % 3
  12. [m n]=size(a);
  13. N=3;
  14. AA = cat(1,a,b,c);
  15. rowM=repmat(reshape(1:m*N,N,[])',1,n);
  16. colN=repmat(1:n*N,m,1);
  17. linearInd = sub2ind(size(a)*N, rowM, colN);
  18. D(size(a,1)*N,size(a,2)*N)=0;
  19. D(linearInd)=AA;
  20. toc
复制代码

  1. Elapsed time is 0.000208 seconds.
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-12-31 23:17:34 | 显示全部楼层 来自 北京海淀
感觉也可不用kron这样的函数,用最简单基本的矩阵行列变换不知道行不行:
  1. A(9,12)=0;                   %A矩阵扩维
  2. B(9,12)=0;                   %B矩阵扩维
  3. C(9,12)=0;                   %C矩阵扩维
  4. D=A([1,4,5,2,6,7,3,8,9],[1,5,6,2,7,8,3,9,10,4,11,12])+...
  5.   B([4,1,5,6,2,7,8,3,9],[5,1,6,7,2,8,9,3,10,11,4,12]) +...
  6.   C([4,5,1,6,7,2,8,9,3],[5,6,1,7,8,2,9,10,3,11,12,4])
复制代码

评分

1

查看全部评分

回复 不支持

使用道具 举报

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

本版积分规则

Simapps系列直播

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

GMT+8, 2024-10-5 03:28 , Processed in 0.064091 second(s), 21 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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