一、奇数阶魔方矩阵的编程
魔方矩阵的设计思想之一,是构造一个扩展的零矩阵A,随后用顺序数矩阵v填入A的相应对角线,再用行、列叠加使矩阵A的中心n阶矩阵零元素填满,最后取出中心n阶方阵,既得魔方矩阵。
下面是奇数阶魔方矩阵的程序,程序名为odd_magic。
%This is program for creating a matrix of odd order magic.
clear %清内存
n=input('please input an odd number\n'); %输入一个奇数
if mod(n,2)==0 %若为偶数,则中断程序
'input number must be odd.';
end
n1=2*n-1;m=(n-1)/2; %计算扩展零矩阵A的行、列数n1和上下对角线数m(不包括住对角线)
A=zeros(n1);
for i=1:n %设置顺序数矩阵v
for j=1:n
v(i,j)=(i-1)*n+j;
end
end
for k=1:m+1 %在A矩阵内,填写m+1条上对角线
B=zeros(1,n-2+2*k);
B(k:(k+n-1))=v(k,:);
A=A+diag(B,n+1-2*k);
end
for k=m+2:n %在A矩阵内,填写m条下对角线
B=zeros(1,3*n-2*k);
B(n-k+1:2*n-k)=v(k,:);
A=A+diag(B,n+1-2*k);
end
if m==1 %3阶魔方时,行、列叠加填数
A(4,:)=A(4,:)+A(1,:);A(2,:)=A(2,:)+A(5,:);
A(:,4)=A(:,4)+A(:,1);A(:,2)=A(:,2)+A(:,5);
else %3阶以上奇数阶次时,行、列叠加填数
Bu=A(1:m,:);
Bd=A((n1-m+1):n1,:);
B1=A(:,1:m);Br=A(:,(n1-m+1):n1);
A(m+1:2*m,:)=A(m+1:2*m,:)+Bd;
A((n1-2*m+1):n1-m,:)= A((n1-2*m+1):n1-m,:)+Bu;
A(:,m+1:2*m)=A(:,m+1:2*m)+Br;
A(:,(n1-2*m+1):n1-m)=A(:,(n1-2*m+1):n1-m)+Bl;
end
M=A(m+1:(n1-m),m+1:(n1-m)); %取中央n阶矩阵,即为魔方矩阵
例3-17
用上述程序,计算3阶魔方矩阵。
在命令窗口输入以下代码:
>> odd_magic
please input an odd number
3
M=
4 9 2
3 5 7
8 1 6
例3-18
用上述程序,计算5阶魔方矩阵。
>> odd_magic
please input an odd number
5
>> n
n =
5
>> M %5阶魔方矩阵
M =
11 24 7 20 3
4 12 25 8 16
17 5 13 21 9
10 18 1 14 22
23 6 19 2 15
>> v %顺序数矩阵
v =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25
>> A %扩展矩阵
A =
0 0 0 0 1 0 0 0 0
0 0 0 6 0 2 0 0 0
0 0 11 24 7 20 3 0 0
0 16 4 12 25 8 16 4 0
21 0 17 5 13 21 9 0 5
0 22 10 18 1 14 22 10 0
0 0 23 6 19 2 15 0 0
0 0 0 24 0 20 0 0 0
0 0 0 0 25 0 0 0 0
调用MATLAB的5阶魔方矩阵如下:
>> magic(5)
ans =
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
它与M矩阵的排列不同,但行、列元素之和等于对角线之和
>> sum(M) %列元素之和的向量
ans =
65 65 65 65 65
>> sum(M') %行元素之和的向量
ans =
65 65 65 65 65
>> trace(M) %主对角线元素之和
ans =
65
>> trace(M') %反向对角线元素之和
ans =
65
二、数据类型概述
三、字符型数组
用单括号括起来的字符和数字的组合称为字符串或字符数组。MATLAB中对字符串的书写格式为
字符串数组可以和矩阵一样实行水平连接(strcat)、垂直连接(strvcat),可以进行字符数组的比较(strcmp)、字符串替换(strrep)、寻找(findstr) 等运算。