n*n Matrix
遇到一个问题,求帮助,问题是,写一个 Function, 产生一个 n*n Matrix, 包含从1 到 n^2的数字,但数字必须从matrix中心开始以顺时针向外扩展,举例:n=2,----;n=3,-- ;尝试了几次,不成功,怎么办呢??$考虑$ 最笨的方法就是循环咯.n+1的matrix是由n的matrix加一行一列构成的.至于加到左上角还是右下角要看n是odd还是even的. 楼上的,请具体说明,怎么循环??$考虑$ ,用循环的话,是不是必须给出一个基础matrix,由此向外发展,我现在在考虑,先检查 n 是奇数还是偶数,然后从最外面向里走,可是在定位上算不下去了,x 和 y 坐标有不规则交换!!不知道该怎么办??$考虑$ 是不是又是什么面试亚?以前国内面试人家的时候出过类似的题。这里给你一个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 编辑 ] 楼上的,先谢谢啦,看上去好多啊,先慢慢消化啦!!:) 不是面试,是老师留的作业,呵呵!!自己实在研究不出来,:)
对啦!!.cpp是什么文件呢??$考虑$ 是和 .m 文件类似么??请解释一下!!谢啦!!$支持$ 怎么存:cpp呢?存在哪里呢?
[ 本帖最后由 gy100002000 于 2007-9-19 19:49 编辑 ] 你们的作业还挺有意思的。
如果是matlab里面,用命令 edit可以打开一个文本编辑窗口。然后,就 复制,粘贴,然后save as就可以了。
cpp是c语言的源程序文件,和m文件相同的地方,都是文本格式的。不同的是,有不同的语法。
文件看起来长是因为matlab 和 c语言的接口问题,不过主要的函数就一个 myFill
思路大致就是按照填数的方法,先向右,再向下,再向左,再向上。每四个方向结束后,重复下一圈。每一圈填的数的个数是一个等差递增数列 1 3 5 7 。。。
就这样。 好麻烦,我会尝试一下的。:)谢谢啦!!$支持$ $支持$看来走MATLAB的路还很长:) 昏倒,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 我估计老师的目的也就是让学生练习一下matrix加行加列吧. 恩,可以用stacking,也可以不用
页:
[1]
2