萍聚社区-德国热线-德国实用信息网

 找回密码
 注册

微信登录

微信扫一扫,快速登录

萍聚头条

查看: 6877|回复: 10

[电子] n*n Matrix

[复制链接]
发表于 2007-9-19 10:45 | 显示全部楼层 |阅读模式

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

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

x
遇到一个问题,求帮助,问题是,写一个 Function,   产生一个 n*n Matrix, 包含从1 到 n^2的数字,但数字必须从matrix中心开始以顺时针向外扩展,举例:n=2,----[1  2 ; 3  4];  n=3,-- [7  8  9 ; 6  1  2 ; 5  4  3];  尝试了几次,不成功,怎么办呢??$考虑$
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-19 10:58 | 显示全部楼层
最笨的方法就是循环咯.
n+1的matrix是由n的matrix加一行一列构成的.至于加到左上角还是右下角要看n是odd还是even的.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-9-19 11:09 | 显示全部楼层
楼上的,请具体说明,怎么循环??$考虑$ ,用循环的话,是不是必须给出一个基础matrix,由此向外发展,我现在在考虑,先检查 n 是奇数还是偶数,然后从最外面向里走,可是在定位上算不下去了,x 和 y 坐标有不规则交换!!不知道该怎么办??$考虑$
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-19 16:56 | 显示全部楼层
是不是又是什么面试亚?以前国内面试人家的时候出过类似的题。这里给你一个c++的解决方法吧,思路是一样的。在matlab里面,你只要将下面的代码存成myCYCLE.cpp,然后用mex myCYCLE.cpp然后就可以运行了;结果如下:

>>mex myCYCLE.cpp

>>myCYCLE(5)

ans =

    21    22    23    24    25
    20     7     8     9    10
    19     6     1     2    11
    18     5     4     3    12
    17    16    15    14    13

>> A = myCYCLE(4)

A =

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

>>


  1. //---------------------------------------------------------------------------
  2. //File Name: myCYCLE.cpp
  3. //---------------------------------------------------------------------------
  4. #include "mex.h"
  5. #define MY_LCC
  6. //---------------------------------------------------------------------------
  7. #define MY_RIGHT 0
  8. #define MY_DOWN  1
  9. #define MY_LEFT  2
  10. #define MY_UP    3
  11. //---------------------------------------------------------------------------
  12. void myFill(double *pData, int n){
  13.     int nX, nY, nLen, nNum, i, j=n*n;
  14.     int nCount = 0;
  15.     int nDir = MY_RIGHT;
  16.     nNum = nLen = 1;
  17.     nX = nY = (n - 1) / 2;
  18.     pData[nX + nY*n] = nNum++;          //   position of 1
  19.     while(nNum <= j ){
  20.         for(i = 0; i < nLen; i++){
  21.             switch(nDir){
  22.                     case MY_LEFT:  nY--; break;
  23.                     case MY_RIGHT: nY++; break;
  24.                     case MY_UP:    nX--; break;
  25.                     case MY_DOWN:  nX++; break;
  26.                     default:  break;
  27.             }
  28.             pData[nX + nY*n] = nNum++;
  29.         }
  30.         nCount++;
  31.         if((nCount&1)== 0)nLen++;
  32.         nDir = (nDir + 1) & 3;
  33.     }
  34. }
  35. //---------------------------------------------------------------------------
  36. #ifndef MY_LCC
  37. //---------------------------------------------------------------------------
  38. //#pragma argsused
  39. //int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
  40. //{
  41. //        return 1;
  42. //}
  43. //---------------------------------------------------------------------------
  44. void _export  mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  45. #else
  46. void  mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
  47. #endif
  48. {
  49. int n = 13;
  50. double pOut;

  51. if (1!=nrhs && 0!=nrhs) mexErrMsgTxt("Using: aOut = myCYCLE( n ); Default or In case any error in the input value, n=13");   
  52. if (1==nrhs)
  53. if (!mxIsDouble(prhs[0])|| mxIsComplex(prhs[0]) || mxGetN(prhs[0]) * mxGetM(prhs[0]) != 1 ){
  54.    printf("Using: aOut = myCYCLE( n ); and n must be a Scalar, now 13 is used !");
  55. }else n = (int) mxGetScalar(prhs[0]);
  56. if(n<1)n = 13;
  57. plhs[0] = mxCreateDoubleMatrix(n , n, mxREAL);
  58. myFill((double *)mxGetPr(plhs[0]), n);
  59. }
复制代码

[ 本帖最后由 recbio 于 2007-9-19 16:58 编辑 ]

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-9-19 19:47 | 显示全部楼层
楼上的,先谢谢啦,看上去好多啊,先慢慢消化啦!!:) 不是面试,是老师留的作业,呵呵!!自己实在研究不出来,:)
对啦!!.cpp是什么文件呢??$考虑$ 是和 .m 文件类似么??请解释一下!!谢啦!!$支持$ 怎么存:cpp呢?存在哪里呢?

[ 本帖最后由 gy100002000 于 2007-9-19 19:49 编辑 ]
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-19 20:56 | 显示全部楼层
你们的作业还挺有意思的。

如果是matlab里面,用命令 edit可以打开一个文本编辑窗口。然后,就 复制,粘贴,然后save as就可以了。

cpp是c语言的源程序文件,和m文件相同的地方,都是文本格式的。不同的是,有不同的语法。

文件看起来长是因为matlab 和 c语言的接口问题,不过主要的函数就一个 myFill

思路大致就是按照填数的方法,先向右,再向下,再向左,再向上。每四个方向结束后,重复下一圈。每一圈填的数的个数是一个等差递增数列 1 3 5 7 。。。

就这样。
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
 楼主| 发表于 2007-9-19 23:35 | 显示全部楼层
好麻烦,我会尝试一下的。:)  谢谢啦!!$支持$ $支持$  看来走MATLAB的路还很长:)
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-20 14:40 | 显示全部楼层
昏倒,Matlab的小作业,不至于要调C吧
随手写了段,可能有点笨,但也还好啦
A=[1 2; 4 3];
N=5;
for n=2:N
    key=round(((n+1)^2-n^2)/2)+n^2;
    if mod(n,2)==0
        A=[key+1:key+n;A];
        A=[(key:-1:key-n)' A]

    else
        A=[A (key-n:key-1)'];
        A=[A;key+n:-1:key]
    end
end

评分

1

查看全部评分

Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2007-9-20 14:42 | 显示全部楼层
我估计老师的目的也就是让学生练习一下matrix加行加列吧.
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
发表于 2008-2-13 20:56 | 显示全部楼层
Die von den Nutzern eingestellten Information und Meinungen sind nicht eigene Informationen und Meinungen der DOLC GmbH.
您需要登录后才可以回帖 登录 | 注册 微信登录

本版积分规则

手机版|Archiver|AGB|Impressum|Datenschutzerklärung|萍聚社区-德国热线-德国实用信息网 |网站地图

GMT+2, 2024-4-28 13:07 , Processed in 0.455650 second(s), 24 queries , MemCached On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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