solitarytear 发表于 2009-1-5 21:08

如何生成矩阵

请教:如果已知函数 f(m,n)=m^2+n^2+1; m和n为1到N上的整数,请问如何获得一个以f(m,n)为元素的N阶方阵?

ChaChing 发表于 2009-1-5 21:56

回复 楼主 solitarytear 的帖子

N=10; nn=.^2; mm=nn';
ff=repmat(mm,1,10)+repmat(nn,10,1)+ones(10);

solitarytear 发表于 2009-1-5 22:49

回复 沙发 ChaChing 的帖子

多谢您的回复,您的方法很好,用下面的方法也可以,但对于这个问题用两个for 语句计算速度是不是要慢些?
N=128;
for k=1:N;
for j=1:N;
f(k,j)=k^2+j^2+1;
j=j+1;
end
k=k+1;
end
size(f)

ch_j1985 发表于 2009-1-5 23:03

回复 板凳 solitarytear 的帖子

自己试一下
doc tic

ChaChing 发表于 2009-1-6 10:06

回复 板凳 solitarytear 的帖子

楼主应该是学过fortran/C之语言的, 才会有j=j+1之习惯
试试以下(j=j+1及k=k+1是多馀的)
N=128; f=zeros(N);
for k=1:N, for j=1:N, f(k,j)=k^2+j^2+1; end; end

[ 本帖最后由 ChaChing 于 2009-1-6 10:11 编辑 ]

ChaChing 发表于 2009-1-6 10:12

回复 板凳 solitarytear 的帖子

个人以工程观点觉得, 若不是矩阵很大或程序很复杂, 你的写法未尝不可, 至少非常直觉方便日後易读!

sogooda 发表于 2009-1-6 10:44


clear;clc
tic
N=1280;
=meshgrid(1:N,1:N);
f=m.^2+n.^2+1;
toc

clear;
tic
N=1280; f=zeros(N);
for k=1:N, for j=1:N, f(k,j)=k^2+j^2+1; end; end
toc
Elapsed time is 0.222037 seconds.
Elapsed time is 0.177106 seconds.

sogooda 发表于 2009-1-6 10:46

回复 7楼 sogooda 的帖子

通过7楼的测试发现,其实这样的循环也不慢。呵呵。

solitarytear 发表于 2009-1-6 11:05

三种方法的速度比较

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%方法一
clear;clc
tic   % 测试开始
N=1024;
for k=1:N;
for j=1:N;
f(k,j)=k^2+j^2+1;
j=j+1;
end
k=k+1;
end
toc   % 测运行时间   
Elapsed time is 5.811530 seconds.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%方法二(快多了)
clear;clc
tic   % 测试开始
N=1024;
nn=.^2;
mm=nn';
ff=repmat(mm,1,N)+repmat(nn,N,1)+ones(N);
toc   %%%   
Elapsed time is 0.047724 seconds.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%方法三
clear;clc
tic   % 测试开始
N=1024;
f=zeros(N);
for k=1:N
for j=1:N
f(k,j)=k^2+j^2+1;
end
end
toc   %
Elapsed time is 1.258142 seconds.

solitarytear 发表于 2009-1-6 11:11

9楼的三个方法

这是个很有趣的问题,方法二居然比方法一快了100多倍,
但方法一和方法三实质上是一致的,但为什么差别也如此明显?

sogooda 发表于 2009-1-6 14:05

回复 10楼 solitarytear 的帖子

在这种情况下,预先分配变量大小可以提高速度。
页: [1]
查看完整版本: 如何生成矩阵