gy100002000 发表于 2007-9-19 09:45

n*n Matrix

遇到一个问题,求帮助,问题是,写一个 Function,   产生一个 n*n Matrix, 包含从1 到 n^2的数字,但数字必须从matrix中心开始以顺时针向外扩展,举例:n=2,----;n=3,-- ;尝试了几次,不成功,怎么办呢??$考虑$

软软熊 发表于 2007-9-19 09:58

最笨的方法就是循环咯.
n+1的matrix是由n的matrix加一行一列构成的.至于加到左上角还是右下角要看n是odd还是even的.

gy100002000 发表于 2007-9-19 10:09

楼上的,请具体说明,怎么循环??$考虑$ ,用循环的话,是不是必须给出一个基础matrix,由此向外发展,我现在在考虑,先检查 n 是奇数还是偶数,然后从最外面向里走,可是在定位上算不下去了,x 和 y 坐标有不规则交换!!不知道该怎么办??$考虑$

recbio 发表于 2007-9-19 15: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

>>


//---------------------------------------------------------------------------
//File Name: myCYCLE.cpp
//---------------------------------------------------------------------------
#include "mex.h"
#define MY_LCC
//---------------------------------------------------------------------------
#define MY_RIGHT 0
#define MY_DOWN1
#define MY_LEFT2
#define MY_UP    3
//---------------------------------------------------------------------------
void myFill(double *pData, int n){
    int nX, nY, nLen, nNum, i, j=n*n;
    int nCount = 0;
    int nDir = MY_RIGHT;
    nNum = nLen = 1;
    nX = nY = (n - 1) / 2;
    pData = nNum++;          //   position of 1
    while(nNum <= j ){
      for(i = 0; i < nLen; i++){
            switch(nDir){
                  case MY_LEFT:nY--; break;
                  case MY_RIGHT: nY++; break;
                  case MY_UP:    nX--; break;
                  case MY_DOWN:nX++; break;
                  default:break;
            }
            pData = nNum++;
      }
      nCount++;
      if((nCount&1)== 0)nLen++;
      nDir = (nDir + 1) & 3;
    }
}
//---------------------------------------------------------------------------
#ifndef MY_LCC
//---------------------------------------------------------------------------
//#pragma argsused
//int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
//{
//      return 1;
//}
//---------------------------------------------------------------------------
void _exportmexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
#else
voidmexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[])
#endif
{
int n = 13;
double pOut;

if (1!=nrhs && 0!=nrhs) mexErrMsgTxt("Using: aOut = myCYCLE( n ); Default or In case any error in the input value, n=13");   
if (1==nrhs)
if (!mxIsDouble(prhs)|| mxIsComplex(prhs) || mxGetN(prhs) * mxGetM(prhs) != 1 ){
   printf("Using: aOut = myCYCLE( n ); and n must be a Scalar, now 13 is used !");
}else n = (int) mxGetScalar(prhs);
if(n<1)n = 13;
plhs = mxCreateDoubleMatrix(n , n, mxREAL);
myFill((double *)mxGetPr(plhs), n);
}


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

gy100002000 发表于 2007-9-19 18:47

楼上的,先谢谢啦,看上去好多啊,先慢慢消化啦!!:) 不是面试,是老师留的作业,呵呵!!自己实在研究不出来,:)
对啦!!.cpp是什么文件呢??$考虑$ 是和 .m 文件类似么??请解释一下!!谢啦!!$支持$ 怎么存:cpp呢?存在哪里呢?

[ 本帖最后由 gy100002000 于 2007-9-19 19:49 编辑 ]

recbio 发表于 2007-9-19 19:56

你们的作业还挺有意思的。

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

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

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

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

就这样。

gy100002000 发表于 2007-9-19 22:35

好麻烦,我会尝试一下的。:)谢谢啦!!$支持$ $支持$看来走MATLAB的路还很长:)

软软熊 发表于 2007-9-20 13:40

昏倒,Matlab的小作业,不至于要调C吧
随手写了段,可能有点笨,但也还好啦
A=;
N=5;
for n=2:N
    key=round(((n+1)^2-n^2)/2)+n^2;
    if mod(n,2)==0
      A=;
      A=[(key:-1:key-n)' A]

    else
      A=;
      A=
    end
end

软软熊 发表于 2007-9-20 13:42

我估计老师的目的也就是让学生练习一下matrix加行加列吧.

johndoe 发表于 2008-2-13 19:56

恩,可以用stacking,也可以不用
页: [1] 2
查看完整版本: n*n Matrix